gpt4 book ai didi

c++ - Visual Studio C++ header

转载 作者:行者123 更新时间:2023-11-28 01:04:59 25 4
gpt4 key购买 nike

我需要创建这样的结构:

// file main.h:
#pragma once

#ifndef _MAIN_H
#define _MAIN_H

#include <iostream>

#include "first.h"
#include "second.h"

#endif
// -----------------

// file first.h:
#pragma once

#ifndef _FIRST_H
#define _FIRST_H

#include "main.h" // because of using SomeFunction() in first.cpp

int SomeVar; // used in first.cpp

#endif
// -----------------

// file second.h:
#pragma once

#ifndef _SECOND_H
#define _SECOND_H

#include "main.h" // because of using SomeVar in second.cpp

int SomeFunction(); // implemented in second.cpp

#endif
// -----------------

按照逻辑,如果 main.h 将首先被编译,那么每个头文件将只包含一次,并且所有变量/函数将被正常定义。

例如,此配置在 IAR C++ 编译器中正常编译,如果在选项“preinclude file”(未预编译)中设置为 main.h

但是,在 Visual Studio 2010 中,相同的结构会导致链接器错误,例如:

1>second.obj : error LNK2005: "int SomeVar" (?SomeVar@@3HA) already defined in first.obj
1>second.obj : error LNK2005: "int SomeFunction" (?SomeFunction@@3HA) already defined in first.obj

我认为是因为按字母顺序包含文件。显然,pragma- 和 define-guards 被链接器忽略了。

可以通过额外的 header 和外部 变量定义来修复错误,但这是一种困难且错误的方法。

问题是:我该怎么办?

最佳答案

int SomeVar; // used in first.cpp

永远不要在标题中定义变量。它们应该用 extern 声明:

extern int SomeVar; // used in first.cpp

然后您实际上可以在“first.cpp”中使用 int SomeVar; 定义它们。


此外,“first.h”不需要包含“main.h”。如果标题中的定义绝对需要这些文件的内容,则标题应该包含文件。 “first.h”中的定义不需要“main.h”中的任何内容。因此,它不应包含它。

如果“first.cpp”需要包含“second.h”中的内容,则“first.cpp”有责任包含它。

关于c++ - Visual Studio C++ header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6706110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com