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