5

この質問はすでに出されていると思いますが、見つかりませんでした。次のような定数の代わりにマクロを使用する場合:

 #define A 0
 #define B (A+1)
 #define C (B+A)

次に、厳密な順序で定義されることが保証されます (A、B、C)。しかし、代わりに const を使用するとどうなるでしょうか?

 const int A = 0;
 const int B = A + 1;
 const int C = A + B;

それが関数スコープ内にある場合は、問題ありません。しかし、グローバル スコープはどうでしょうか。私の知る限り、グローバル変数の定義の順序は保証されていません。そして、constsはどうですか?

これが、マクロの代わりに const を使用するのを止める最後の理由だと思います。

(この特定の問題で C と C++ の間に違いがあるかどうかも興味があります)。

UPD: 質問は次のようにする必要があります: この問題における C と C++ の違い (もしあれば) は何ですか?

4

4 に答える 4

6

標準の§3.6.2/2によると:

単一の翻訳単位内で定義された順序付けられた初期化を持つ変数は、翻訳単位での定義の順序で初期化されます。

したがって、コードは整形式であり、標準の C++ コンパイラで 1 つの結果が得られます。

于 2013-11-11T11:05:07.923 に答える
0

これCはエラーです。これは、const変数が c コンパイラによってメモリに割り当てられているためです。

コンパイラでは、コードに変数をC++自由に埋め込むことができます。constしたがって、C++ はエラーをスローしません。変数には、( ) 演算子constのアドレスを使用する場合にのみメモリが割り当てられます。&

したがってC++、3行がその順序である場合、コードは機能します。では、変数を使用して a を初期化できないCため、コンパイラはエラーをスローします!!!const

于 2013-11-11T12:44:18.780 に答える