相关疑难解决方法(0)

C - 通过const声明访问非const

是否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

要使两种合格类型兼容,两者都应具有相同类型的兼容类型; [...]

所以,它未定义的行为.

c const extern

6
推荐指数
1
解决办法
460
查看次数

标签 统计

c ×1

const ×1

extern ×1