在头文件中定义变量-C

时间:2012-07-17 07:53:24

标签: c header

假设我有三个源文件( .c ),其中三个包含“file.h”,即每个文件的开头我写了#include "file.h"

file.h本身,我写了int num=4

我有一个普遍的启动问题。当我写int num时,它编译了。

有什么问题?为什么非初始化案例有效?

(我正在使用Eclispe)

2 个答案:

答案 0 :(得分:2)

在C头文件中,编译器没有任何特殊的语义,它们只是由预处理器内联扩展的文本。这意味着链接器将看到您的变量定义三次。为避免混淆,链接器不知道三个值中的哪一个是正确的。尽管这次碰巧它们具有相同的值,但链接器是愚蠢的,并且不知道。

如果你只有“int num;”,这是一个特殊情况,变量被分配为公共而不是数据,链接器知道在最后的链接阶段统一公共。一般来说,我认为使用commons和头文件是不好的形式应该只有“extern int foo;”而变量本身只在一个链接单元中定义。

答案 1 :(得分:2)

您可以根据需要多次声明一个全局变量,但只能在一个翻译单元中初始化一次。所以在file.h

extern int num;

并在某些file.c中写

int num = 4;

确保只在一个C文件中包含最后一行;其他人将使用该次发生的价值。