gpt4 book ai didi

C -- 通过 const 声明访问非常量

转载 作者:太空狗 更新时间:2023-10-29 17:20:51 25 4
gpt4 key购买 nike

C 标准是否允许通过 const 声明访问非 const 对象?例如。以下代码是否保证在符合标准的平台上编译和输出 23 和 42?

翻译单元A:

int a = 23;
void foo(void) { a = 42; }

翻译单位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;
}

在 ISO/IEC 9899:1999 中,我刚刚发现(6.7.3,第 5 段):

If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.

但在上面的例子中,对象没有被定义为const(只是被声明)。

更新

我终于在 ISO/IEC 9899:1999 中找到了它。

6.2.7, 2

All declarations that refer to the same object or function shall have compatible type; otherwise, the behavior is undefined.

6.7.3, 9

For two qualified types to be compatible, both shall have the identically qualified version of a compatible type; [...]

因此,它未定义的行为。

最佳答案

TU A 包含a 的(唯一)定义。所以 a 确实是一个非常量对象,它可以从 A 中的函数访问,没有任何问题。

我很确定 TU B 会调用未定义的行为,因为它的 a 声明与定义不一致。到目前为止,我发现支持这是 UB 的最佳报价是 6.7.5/2:

Each declarator declares one identifier, and asserts that when an operand of the same form as the declarator appears in an expression, it designates a function or object with the scope, storage duration, and type indicated by the declaration specifiers.

[编辑:发问者已经在标准中找到了正确的引用,请参阅问题。]

此处,B 中的声明断言 a 的类型为 volatile const int。事实上,该对象没有(限定)类型volatile const int,它具有(限定)类型int。违反语义是 UB。

在实践中,TU A 将被编译为好像 a 是非常量。 TU B 将被编译为就好像 a 是一个 volatile const int,这意味着它根本不会缓存 a 的值。因此,我希望它能在链接器没有注意到和反对不匹配的类型的情况下工作,因为我没有立即看到 TU B 如何可能发出出错的代码。然而,我缺乏想象力并不等同于有保证的行为。

AFAIK,标准中没有任何内容表明文件范围内的 volatile 对象不能存储在与其他对象完全不同的内存库中,这提供了不同的指令来读取它们。该实现仍然必须能够通过例如 volatile 指针读取普通对象,因此假设例如“普通”加载指令适用于“特殊”对象,并且它使用读取指向 volatile 限定类型的指针时。但是,如果(作为优化)实现发出了针对特殊对象的特殊指令,而特殊指令没有对普通对象起作用,那么 boom。我认为这是程序员的错,尽管我承认我在 2 分钟前才发明这个实现,所以我不能完全相信它符合要求。

关于C -- 通过 const 声明访问非常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8051969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com