为什么在C中初始化这种方式给出多个定义错误?

时间:2012-07-19 10:30:08

标签: c

以下是我将用作示例的两个文件。如果我在file1.h中定义了一个结构数组,并且file2.c包含了file1.h,我会得到一个多重定义错误。这是为什么?如果我只有结构线程任务[32],我不会收到此错误。

file1.h

...
...
struct thread tasks[32] = {0}; // thread is structure defined above
...
...

file2.c中

#include file1.h

3 个答案:

答案 0 :(得分:2)

您很可能将头文件包含在多个源文件中。 #include指令字面上将头文件的内容包含在源文件中,这意味着头文件中的所有代码也将在源文件中。这意味着如果两个或多个源文件包含相同的头文件,则头文件中的代码将被复制。

答案 1 :(得分:2)

= {0}声明中的行转换为定义。您可以根据需要拥有尽可能多的(兼容的)文件范围变量声明,但最多只能定义一个;通过在多个源文件中包含标题,您将生成多个定义。

答案 2 :(得分:1)

您可以通过将头文件的内容包装在#ifndef中来阻止多个包含的问题

/* file1.h */
#ifndef INCLUDE_FILE1
#define INCLUDE_FILE1

/* contents here */

#endif