以下是我将用作示例的两个文件。如果我在file1.h中定义了一个结构数组,并且file2.c包含了file1.h,我会得到一个多重定义错误。这是为什么?如果我只有结构线程任务[32],我不会收到此错误。
file1.h
...
...
struct thread tasks[32] = {0}; // thread is structure defined above
...
...
file2.c中
#include file1.h
答案 0 :(得分:2)
您很可能将头文件包含在多个源文件中。 #include
指令字面上将头文件的内容包含在源文件中,这意味着头文件中的所有代码也将在源文件中。这意味着如果两个或多个源文件包含相同的头文件,则头文件中的代码将被复制。
答案 1 :(得分:2)
= {0}
将声明中的行转换为定义。您可以根据需要拥有尽可能多的(兼容的)文件范围变量声明,但最多只能定义一个;通过在多个源文件中包含标题,您将生成多个定义。
答案 2 :(得分:1)
您可以通过将头文件的内容包装在#ifndef中来阻止多个包含的问题
/* file1.h */
#ifndef INCLUDE_FILE1
#define INCLUDE_FILE1
/* contents here */
#endif