3

Cを学習しようとしていますが、次のコードでエラーが発生します。ボリュームで半径

を使用すると、エラーが発生します。error #2069: Initializer must be constant.

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * radius) );

int main(void){

return 0;
}

しかし、実際の数値で半径を変更すると、正常にコンパイルされます。

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * 10) );

int main(void){

    return 0;
}

なぜこれが発生するのですか?最初のバージョンを機能させるために何ができますか?

4

5 に答える 5

5

C では、非定数式でグローバル変数を初期化することはできません。

C99 標準: セクション 6.7.8:

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

あなたの例でvolumeは、静的ストレージ期間を持つグローバル変数でradiusあり、定数ではありません。したがって、エラー。

于 2013-01-19T12:46:21.530 に答える
3

C では、定数式を使用して関数の外部でのみ変数を初期化できます。 int radius定数式ではありません。

于 2013-01-19T12:44:35.053 に答える
3

非定数式で静的オブジェクトを初期化することはできません。あなたの例では、

float volume = ( 4.0f / (3.0f * PI * radius) );

volumeはグローバル変数で、持続時間は静的です。したがって、非定数式で初期化することはできません。

ただし、volumeがローカル変数の場合、C99 では定数以外の値で初期化できます。したがって、 では次のことが許可されます (非定数の初期化) C99

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;

int main(void){
float volume = ( 4.0f / (3.0f * PI * radius) );
return 0;
}

C90しかし、すべての初期化子が定数式でなければならない場合、同じことは有効ではありません。

于 2013-01-19T12:58:32.397 に答える
1

これは C++ ではなく単なる C であるため、radius定数である必要がありますが、変数として使用する場合は必要です。
次のように定義volumemain()ます

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
int main(void){
float volume = ( 4.0f / (3.0f * PI * radius) );
return 0;
}


これで、エラーが消える可能性があります。

于 2013-01-19T12:49:16.947 に答える
1

この点での定数は、メモリアドレスのないものです。radiusメモリアドレスを持っているため、初期化には使用できません。

于 2013-01-19T12:45:01.923 に答える