在外部声明非常量变量'const'是否合法C?

问题描述

我有一个文件window.h,它定义了:

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”并使用它来修改变量也不是错误。