是否const通过constC标准允许的声明访问非对象?例如,以下代码保证在符合标准的平台上编译和输出23和42?
翻译单位A:
int a = 23;
void foo(void) { a = 42; }
Run Code Online (Sandbox Code Playgroud)
翻译单位B:
#include <stdio.h>
extern volatile const int a;
void foo(void);
int main(void) {
printf("%i\n", a);
foo();
printf("%i\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在ISO/IEC 9899:1999中,我刚刚发现(6.7.3,第5段):
如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为是未定义的.
但在上面的例子中,对象没有定义为const(但只是声明).
UPDATE
我终于在ISO/IEC 9899:1999中找到了它.
6.2.7,2
引用同一对象或函数的所有声明都应具有兼容类型; 否则,行为未定义.
6.7.3,9
要使两种合格类型兼容,两者都应具有相同类型的兼容类型; [...]
所以,它是未定义的行为.