c - 为什么我不能在头文件中声明和分配全局变量,即使使用#ifndef HEADER_H

标签 c gcc

我看到了一些类似的问题,但没有一个问题提到了 #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 ...

ma​​in.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/

相关文章:

c - 此 C 代码的输出说明

c - 在 C 中操作字符串的两种方式有什么区别?

c - 尝试编译一个C程序

gcc - 如何获取 gcc 和 g++ 的错误和警告计数?

c - 我的程序在 windows(gcc) 中给出了正确的输出,但在 Linux(gcc) 中它导致了段错误

c - 使用 termios() 替换 EOF?

C:编译错误 - "expected expression"并且没有写其他内容?

c - 我如何将输出打印为以下程序的 5?

gcc - 为多个 SIMD 架构生成代码

ios - 如何剥离 Cocoa Touch Frameworks