1
#define L 1
#define M L+1

int main(void){

    int N=L*M*2;
    char s [N]={'1','2'};
    printf("%d", sizeof(s));

    return 1;   
}

上記のコードをコンパイルできないのはなぜですか?Eclipseのコンパイラーは2つのことを言います:

  1. 可変サイズのオブジェクトが初期化されない可能性があります。マクロでMとLを使用してNを定義したためですか、それともarr[x] 型の配列を初期化できないためですか。xはどのような状況でも可変です。
  2. 配列初期化子の余分な要素-それはどういう意味ですか?
4

3 に答える 3

1

xが変数であるarr[x]型の配列を初期化できないためですか?

実際、C99より前では、配列サイズは定数式でなければなりません。C99では、これは可変長配列で緩和されています。

(これはマクロとは関係ありません。)

配列初期化子の余分な要素-それはどういう意味ですか?

最初の問題を修正すれば、これはなくなるはずです。

于 2012-07-19T14:10:13.940 に答える
1

この例の配列サイズは、で指定されていますがN、これは定数ではありません。これは、配列がVLA(可変長配列)であることを意味します。C言語では、VLA宣言で初期化子を使用できません。

それをコンパイルするために、N私は定数にする必要があります(MLは定数なので、定数にNすることもできます)。Nを使用して宣言する#defineか、列挙型メンバーとして宣言します。

于 2012-07-19T14:15:56.907 に答える
0

もし私が正確に覚えていれば、

char s [N]={'1','2'};

Nは定数である必要があります

于 2012-07-19T14:11:33.123 に答える