在头文件中声明一个全局变量`extern const int`,但在源文件中只声明`int`

我正在试验GCC,发现你可以在头文件中声明外部变量const ,但在实现文件中保持它们是可变的。

编辑 :这实际上不起作用。 我将测试代码编译的唯一原因是因为我没有在“header.c”中包含“header.h”。

header.h:

 #ifndef HEADER_H_ #define HEADER_H_ extern const int global_variable; #endif 

header.c:

 int global_variable = 17; 

这似乎是一个非常好的function,用于将global_variable readonly保存到header.h的用户,但保持它们可由实现(header.c)修改。

注意:以下代码只是这种声明方式如何阻止赋值给global_variable

 #include "header.h" int main(void) { global_variable = 34; /* This is an error as `global_variable` is declared const */ return 0; } 

因为我之前从未见过技术。 我开始怀疑它是否有效。

这是一个定义明确的行为,还是GCC没有提醒我的错误?

const intint是不兼容的类型。

例如:

 extern const int a; int a = 2; 

在C中无效,因为C表示:

(C11,6.7p4)“同一范围内涉及同一对象或function的所有声明均应指定兼容类型”

在你的情况下,他们不在同一范围(不同的翻译单位),但C也说:

(C11,6.2.7p2)“所有引用相同对象或函数的声明都应具有兼容类型;否则,行为未定义。”

当您违反上述规则时,您正在调用未定义的行为。

请注意,C90具有相同的段落。

有点晚了,但无论如何。

我认为如果你做这样的事情,这可能有用

在header.h中:

 #ifndef HEADER_H_ #define HEADER_H_ #ifndef HAS_GLOB_VAR extern const int global_variable; #endif #endif 

如果你需要在实际定义变量( header.c )的文件中包含标题,你可以做类似的事情

 #define HAS_GLOB_VAR #include "header.h" int global_variable = 17; ... 

在其他文件上,您只需包含标题,不要定义HAS_GLOB_VAR

您没有为global_variable分配值,而是在定义它。