0

我正在尝试在许多其他 .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"

但它仍然不起作用!

4

3 回答 3

5

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

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

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

第三,您的问题可能是 ints a 和 b 都在两个 .cpp 文件中定义(通过标题包含)导致多个定义的符号。

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

extern int a;
extern int b;

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

int a;
int b;

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

于 2012-07-16T17:10:59.513 回答
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 的设置或获取。

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

(也很抱歉很长时间才回来回答这个问题,因为当我认为它是如此初级以至于我对我在提问时缺乏知识感到有点羞愧时,我有点尴尬。其次,因为这是我的第一次堆栈上的问题,我也认为可以更好地提出我的问题,以更好地了解我的要求)

于 2014-04-16T16:06:53.273 回答
-1

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

于 2012-07-16T16:57:56.670 回答