假设我有三个源文件( .c ),其中三个包含“file.h”,即每个文件的开头我写了#include "file.h"
在file.h
本身,我写了int num=4
。
我有一个普遍的启动问题。当我写int num
时,它编译了。
有什么问题?为什么非初始化案例有效?
(我正在使用Eclispe)
答案 0 :(得分:2)
在C头文件中,编译器没有任何特殊的语义,它们只是由预处理器内联扩展的文本。这意味着链接器将看到您的变量定义三次。为避免混淆,链接器不知道三个值中的哪一个是正确的。尽管这次碰巧它们具有相同的值,但链接器是愚蠢的,并且不知道。
如果你只有“int num;”,这是一个特殊情况,变量被分配为公共而不是数据,链接器知道在最后的链接阶段统一公共。一般来说,我认为使用commons和头文件是不好的形式应该只有“extern int foo;”而变量本身只在一个链接单元中定义。
答案 1 :(得分:2)
您可以根据需要多次声明一个全局变量,但只能在一个翻译单元中初始化一次。所以在file.h
写
extern int num;
并在某些file.c
中写
int num = 4;
确保只在一个C文件中包含最后一行;其他人将使用该次发生的价值。