4

質問に答えていて、このテスト プログラムを作成しました。

#include <stdio.h>
int main()
{
    volatile const int v = 5;
    int * a = &v;
    *a =4;
    printf("%d\n", v);
    return 0;
}

volatile キーワードがない場合、コードは var の変更を最適化し (-O3 apple clang 4.2 でコンパイル)、期待どおりに機能し、const 変数が正しく変更されます。

より経験豊富な C 開発者が、これが安全でない、または UB であると言う標準の部分があるかどうかを知っているかどうか疑問に思っていました。

更新: @EricPostpischilがこの標準の引用をくれました

プログラムは、C 2011 (N1570) 6.7.3 6 に従って、const 修飾された型で定義された独自のオブジェクトを変更することはできません。非 const 修飾型の場合、動作は未定義です。」外部エージェントは、6.7.3 7 に従って、volatile 修飾された型を持つオブジェクトを変更する可能性があります。

私のプログラムは最初の規則に違反していますが、2 番目の規則はプログラムを最初の規則から除外する可能性があると考えました。

更新 2:

volatile 修飾された型を持つオブジェクトは、実装に不明な方法で変更されたり、その他の未知の副作用を持つ可能性があります。したがって、そのようなオブジェクトを参照する式は、5.1.2.3 で説明されているように、抽象マシンの規則に従って厳密に評価される必要があります。さらに、すべてのシーケンスポイントで、オブジェクトに最後に格納された値は、前述の未知の要因によって変更された場合を除き、抽象マシンによって規定された値と一致する必要があります.134) volatile 修飾された型を持つオブジェクトへのアクセスを構成するものは実装-定義されています。

この引用を見ると、特定のルールに従って var を評価する必要があることがわかります。すべてのセクションを読んだわけではありませんが5.1.2.3、これにより問題が明らかになる可能性があると思います。

4

2 に答える 2

3

他のコンパイラでの使用に対して同じ動作が保証されないため、安全ではありません。したがって、コードはコンパイラに依存し、コンパイラ スイッチに依存することさえあります。それが悪い考えである理由です。

于 2013-08-05T18:11:48.297 に答える