C 在外部声明一个非常量变量 'const' 合法吗?

Is it legal C to declare a non-const variable 'const' externally?

假设我有一个文件 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 对象,甚至使用指向非 constconst 限定的对象中读取(但不改变)的限定类型。但请注意,只要变量的实际定义不是 const 限定的,从指针“丢弃 const”并使用它来修改变量也不是错误。