0

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

file.h自己写的int num=4

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

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

(我正在使用 Eclispe)

4

2 回答 2

2

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

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

于 2012-07-17T08:00:08.327 回答
2

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

extern int num;

在一些file.c

int num = 4;

确保只在一个 C 文件中包含最后一行;其他人将使用那一次出现的值。

于 2012-07-17T08:01:02.963 回答