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

时间:2012-07-16 16:41:19

标签: c++ c header linker

我试图在一些其他.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"

仍然不起作用!

3 个答案:

答案 0 :(得分:5)

首先,如果您提供了实际错误,它会有所帮助。

其次,你应该用这样的INCLUDE GUARD包装你的标题内容:

#ifndef MY_UNIQUE_INCLUDE_GUARD
#define MY_UNIQUE_INCLUDE_GUARD
... // header contents
#endif

第三,您的问题可能是在两个.cpp文件中定义了一个和一个整体(通过标题包含),导致多个已定义的符号。

相反,您可能意味着在标题中声明它们而不定义它们:

extern int a;
extern int b;

然后,在.cpp文件中,定义它们:

int a;
int b;

只需在一个.cpp文件中定义它们即可。如果对您的项目有意义,您可以在一个.cpp文件中定义一个,在另一个.cpp文件中定义b。

答案 1 :(得分:1)

我弄清楚我做错了什么。这是因为我对头文件实际工作的误解以及实际上我想要做的事情是如此简单/基本以至于人们(回答我)错误地认为我实际上想做什么(我向他们道歉) 。

我应该做的是在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。

希望这可以帮助人们,如果他们试图解决这个问题。

(也很抱歉很长一段时间回来回答这个问题,因为当我觉得有点尴尬时我觉得有点惭愧,因为我对提问这个问题缺乏了解而感到有点惭愧。其次是这个这是我在堆栈上的第一个问题,我也认为我的问题可能会被更好地提出,以便更多地了解我所要求的内容)

答案 2 :(得分:-1)

关于这一点,我很生疏,但我相信只要包含已经包含的文件,就会出现链接错误。从您的示例来看,情况似乎并非如此,但请仔细查看您的文件。这个例子会给你一个错误:file1.h包含file2.h,file3.h包含file1和file2。在这种情况下,您会看到file2将在file3中包含两次。