问题描述
extern const int window_width,window_height;
我不希望任何人更改这些变量,因此它们对于window.h的所有包含者都是常量。但是,在源文件中声明它们为非常量合法吗?
// window.c
int window_width,window_height;
void onResizeWindow(int w,int h) {
window_width = w;
window_height = h;
}
在Apple clang版本12.0.0(clang-1200.0.22.7)中,此编译对我而言没有链接程序错误。但这是合法且定义明确的C吗?
解决方法
否,这是不确定的行为。同一对象的两个声明必须具有兼容的类型,并且非const
限定的类型与同一类型的const
限定的版本不兼容。 (与涉及两个或多个翻译单元的其他问题一样,这种不确定的行为不需要诊断。但是缺少诊断消息并不表示可以。这仅意味着编译器只在一个翻译单元中查看一个翻译单元。时间,因此看不到不一致。)
使用指向const
限定类型的指针访问该类型的非const
对象,甚至使用指向非{{1 }}限定类型,可读取(但不突变)const
限定对象。但是请注意,只要变量的实际定义不符合const
的条件,从指针“放弃const
”并使用它来修改变量也不是错误。