在头文件中声明一个全局变量`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 int
和int
是不兼容的类型。
例如:
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分配值,而是在定义它。