1

これは私のコードです。この部分はメインの外に書きました

typedef struct { int x; } foo;
const int bar = 2;
foo myFoo = { (int) bar };

ただし、これは次を返します。

common.c:6: error: initializer element is not constant
common.c:7: error: (near initialization for ‘myFoo.x’)

コードをコピーしてメインに貼り付けると、機能します。誰か説明をお願いできますか?

4

2 に答える 2

1

enum次のよう に使用できます。

typedef struct { int x; } foo;
enum {bar = 2};
foo myFoo = { bar }; 

また

#define bar 2のように使用

#define bar 2
typedef struct { int x; } foo; 
foo myFoo = { bar }; 

しかし、両方ともコンパイル時に知られています:なぜですか?

typedef struct { int x; } foo; 
foo myFoo = { 2 }; 
const int bar = 2
于 2013-01-24T14:51:17.193 に答える
1

C 2011 6.6 6:

整数定数式は整数型を持ち、整数定数、列挙定数、文字定数、結果が整数定数である sizeof 式、_Alignof 式、およびキャストの即値オペランドである浮動定数であるオペランドのみを持つ必要があります。整数定数式のキャスト演算子は、オペランドの一部として sizeof または _Alignof 演算子を除いて、算術型のみを整数型に変換します。

C 2011 6.7.9 4:

静的またはスレッド保存期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。

の本体内でオブジェクトを定義すると、main自動保存期間が設定されますmain(実行中のみ存在します)。関数の外でグローバルスコープでオブジェクトを定義すると、静的なストレージ期間があります(プログラムの存続期間中存在します)。

自動オブジェクトは、プログラムの実行時に初期化されるため、非定数を含むことができます。したがって、プログラムは計算を実行したり、他のオブジェクトから値を取得して値を計算したりできます。静的オブジェクトの初期値は、プログラム イメージに組み込むことができるように、プログラムを実行する前に使用できる必要があります。myFooあなたの例の の初期値はコンパイル時に把握できることは人間には明らかですが、これには、C 標準で要求する価値があると判断されなかったコンパイラでの追加作業が必要です。

于 2013-01-24T14:52:39.353 に答える