我正在试验GCC并发现你可以在头文件中声明外部变量const
,但在实现文件中保持它们是可变的。
编辑:这确实不起作用。我编译测试代码的唯一原因是因为我没有包含" header.h" in" header.c"。
header.h:
#ifndef HEADER_H_
#define HEADER_H_
extern const int global_variable;
#endif
header.c:
int global_variable = 17;
这似乎是一个非常好的功能,用于将global_variable
只读保存给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没有警告我的错误?
答案 0 :(得分:6)
const int
和int
不兼容。
例如:
extern const int a;
int a = 2;
在C中无效,因为C表示:
(C11,6.7p4)“引用相同对象或函数的同一范围内的所有声明都应指定兼容类型”
在你的情况下,他们不在同一范围内(不同的翻译单位),但C也说:
(C11,6.2.7p2)“引用同一对象或函数的所有声明都应具有兼容类型;否则,行为未定义。”
当您违反上述规则时,您正在调用未定义的行为。
请注意,C90具有相同的段落。
答案 1 :(得分:2)
有点晚了,但无论如何。
我认为如果你做这样的事情可能会有用
在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
。
答案 2 :(得分:0)
您没有为global_variable指定值,而是定义它。