在多个.cpp中包含相同的标头

Including same header in more than one .cpp

本文关键字:包含相 cpp      更新时间:2023-10-16

我正试图在许多其他.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中两次。