53

私はこのようなコードを持っています:

static int a = 6;
static int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
};

しかし、私がそれをコンパイルすると、それはエラーを言います:

ファイルスコープで可変的に変更された「Hello」

どうしてこれが起こるのでしょうか?どうすれば修正できますか?

4

4 に答える 4

74

サイズが変数として指定されている静的配列を持つことはできません

そのため、定数は#definedである必要があります。

#define a 6

このようにして、プリプロセッサはに置き換えaられ6、有効な宣言になります。

于 2012-11-30T13:14:26.547 に答える
10

簡単な答えvariable modified array at file scope is not possible

詳細:

integral constant expression配列の長さはコンパイル時に指定する必要があるため、コンパイル時に作成します。

このような :

#define a 6
#define b 3

または、c99標準に従ってください。gccのようにコンパイルします。

gcc -Wall -std=c99 test.c -o test.out

ここでの問題は、長さを提供する可変長配列が初期化されない可能性があるため、このエラーが発生することです。

単に

static int a =6;
static int b =3;

void any_func()
{
int Hello [a][b]; // no need of initialization no static array means no file scope.
}

次に、forループまたは任意のループを使用して配列を埋めます。

詳細については、デモのみ:

#include <stdio.h>
static int a = 6; 
int main()
{
int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello it's in function
                            //scope but still error
return 0;
}


root@Omkant:~/c# clang -std=c99 vararr.c -o vararr
vararr.c:8:11: error: variable-sized object may not be initialized
int Hello[a]={1,2,3,4,5,6};
          ^
1 error generated. 

静的を削除して初期化を提供すると、上記のようなエラーが発生します。

ただし、初期化だけでなく静的な状態を維持しても、エラーが発生します。

ただし、初期化を削除してそのままにしておくとstatic、以下のエラーが発生します。

error: variable length array declaration not allowed at file scope
static int Hello[a];
           ^     ~
1 error generated.

したがって、可変長配列宣言はファイルスコープでは許可されないため、任意の関数内で関数またはブロックスコープにします(ただし、関数スコープにする場合は初期化を削除する必要があります)

注:Cタグが付けられているので、作成aや作成bconst役に立ちませんが、C++ const正常に機能します。

于 2012-11-30T13:17:40.080 に答える
2

CLANG / LLVMを使用する場合、以下が機能します。

static const int a = 6;
static const int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
}; 

(生成されたアセンブリで表示するには、Helloを使用する必要があるため、最適化されません)

ただし、これはC99モードが選択されている場合(-std = c99)にエラーを生成し、-pedanticが選択されている場合にのみ警告(Wgnu-folding-constant)を生成します。

GCCはこれを許可していないようです(constは読み取り専用として解釈されます)

このスレッドの説明を参照してください。

Linux GCCで理由もなく「初期化要素が一定ではありません」というエラーが発生し、Cをコンパイルします

于 2015-04-02T04:48:28.990 に答える
1

ええ、これは迷惑です:

const int len = 10;

int stuff[len];

エラーが発生します。const intは定数を宣言するためのより良い方法であるため、私は#define xの実行を避けようとしますが、コンパイラが完全に知っていても、constintが真の定数ではない場合があります。

于 2020-12-04T06:25:15.220 に答える