我看到了一些类似的问题,但没有一个问题提到了 #ifndef HEADER_H
。
我有一个头文件和 2 个 C 文件:
常量.h
主.c
mylib.c
在constants.h中:
#ifndef CONSTANTS_H
#define CONSTANTS_H
const int NUM_OF_ITEMS = 22;
#endif
在mylib.c中:
#include "constants.h"
... code ...
在main.c中:
#include "constants.h"
int main() {
... code ...
}
当我使用命令编译时:gcc main.c mylib.c -o main
,我得到以下错误:
/tmp/ccl55fv3.o:(.rodata+0x0): multiple definition of `NUM_OF_ITEMS'
/tmp/ccyZhu6F.o:(.rodata+0x0): first defined here
collect2: ld returned 1 exit status
- 我提到了
#ifndef
,那为什么会这样呢?? - 除了拆分为
constants.h
声明和constants.c
赋值,还有什么办法吗?
最佳答案
包含头文件的每个翻译单元(读取 .c 源文件)都会导致全局变量的新定义。这就是链接器反对存在多个定义的原因。请记住,#include
执行包含文件的文本插入。从编译器的角度来看,您的每个翻译单元都包含 NUM_OF_ITEMS
的不同定义。
您需要在一个翻译单元中定义它。您可能会考虑添加一个 constants.c
,其中包含 NUM_OF_ITEMS
的定义,并在头文件中只留下一个声明。
或者你可以使用宏:
#define NUM_OF_ITEMS 22
或者正如 Jens 在下面的评论中建议的那样,一个枚举常量。
或者如您自己所建议的那样,使用 static
链接,以便对象在每个翻译单元内部。
关于c - 为什么我不能在头文件中声明和分配全局变量,即使使用#ifndef HEADER_H,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26461526/