在多个.cpp中包含相同的标头
Including same header in more than one .cpp
我正试图在许多其他.cpp文件中使用一个.h文件中的数据(甚至函数),我得到了一个提示链接错误的编译器区域。我知道这会很简单,但我正在伤害自己。我正在使用Xcode,但我不认为这是问题所在,更可能是我有点思考!
我的版本更复杂,所以我将使用一个非常简单的例子来说明我正在寻找什么。
如果我有一个头文件data1.h:
int a,b; // etc
然后是一个.cpp文件,比如setdataA.cpp:
#include "data1.h"
void set_a(int numb){ a=1;}
然后是另一个,比如setdataB.cpp:
#include "data1.h"
void set_b(int numb){ b=10;}
我想知道我做错了什么,也许我应该尝试做这样的事情。
我甚至试过换
#include "data1.h"
在setdataB.cpp到中
#include "setdataA.h"
但它仍然不起作用!
首先,如果您提供了实际错误,这将有所帮助。
其次,您应该用一个INCLUDE GUARD来包装您的头内容,如下所示:
#ifndef MY_UNIQUE_INCLUDE_GUARD
#define MY_UNIQUE_INCLUDE_GUARD
... // header contents
#endif
第三,您的问题可能是,在两个.cpp文件中都定义了int a和b(通过标头包含),从而导致了多个定义的符号。
相反,您可能打算在标头中声明它们而不定义它们:
extern int a;
extern int b;
然后,在.cpp文件中,定义它们:
int a;
int b;
只需在一个.cpp文件中定义它们。如果对您的项目有意义,您可以在一个.cpp文件中定义a,在另一个.cpp文件中定义b。
我发现自己做错了什么。这是因为我误解了头文件的实际工作方式,以及我试图做的事情是如此简单/初级,以至于人们(回答我的人)误解了我真正想做的事情(我向他们道歉)。
我应该做的是在data1.cpp中放入
int a;
int b;
void set_a(int numb) { a=numb; }
void set_b(int numb) { b=numb; }
int get_a() { return a }
int get_b() { return b }
然后在data.h中放入
void set_a(int numb);
void set_b(int numb);
int get_a();
int get_b();
data.h可以被包含在任意多的文件中,并且可以通过只调用其中一个函数而不是直接更改或调用它们的值来实现a或b的设置或获取。
如果人们试图解决这个问题,希望这能对他们有所帮助。
(也很抱歉花了很长时间才回来回答这个问题,因为当我觉得这个问题太初级时,我有点尴尬,以至于我对自己在提问时缺乏知识感到有点羞愧。其次,由于这是我在堆栈上的第一个问题,我也认为我的问题本可以问得更好,以更好地了解我的要求)
我对此有点生疏,但我相信无论何时包含已经包含的文件,都会出现链接错误。从你的例子来看,情况似乎并非如此,但请仔细查看你的文件。这个示例会给您一个错误:file1.h包含file2.h,file3.h同时包含file1和file2。您可以看到,在这种情况下,file2将被包含在file3中两次。
- 无法在UE4中包含BP类到CPP类
- 包含在.cpp文件中包含在 .h 文件时包含
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 链接列表在 cpp 中包含不同的对象类
- C++ .h 包含从一个类传递到另一个类的类和.cpp
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 在头文件上包含 cpp 文件是否有缺点?
- 我可以(不)在.cpp文件中包含哪些内容?
- 包含来自 boost 1.73.0 的read_graphviz_new.cpp无法编译
- 只有包含在标头中而不包含在cpp文件中时,标头才会抛出错误
- 将 Boost 标头包含在 .h 文件中但不包含在.cpp文件中时出错
- 在包含新CPP文件后的链接过程中,MSVC 错误
- 在包含 R/Cpp 代码的 R 包中使用 roxygen2 for R 函数
- 将文件包含在.cpp标准中
- 如何将文件作为字符串和代码包含在cpp中
- 为什么我不需要在标题中包含库.cpp?
- 为什么.h文件包含在.cpp文件中,而不是相反
- 为什么我不能将静态库包含在 cpp 文件中?
- 已包含在cpp文件中
- 导出DLL接口中包含相同类的STL类成员