2016-04-16 16 views
0

問題が発生したとき、私はミニGTK + 2.0ゲームをコーディングしていました。私はこれを書くとき:const変数を使用した配列の初期化

const unsigned LABEL_NUMBER = 4; 
const char *LABEL_TEXT[4] = { 
           "Five or More", 
           "By ... " 
           "& ...", 
           "April 2016", 
           "~~ Thanks for playing ~~" 
          }; 

問題はありません。

const unsigned LABEL_NUMBER = 4; 
const char *LABEL_TEXT[LABEL_NUMBER] = { 
              "Five or More", 
              "By ... " 
              "& ...", 
              "April 2016", 
              "~~ Thanks for playing ~~" 
             }; 

gccの答え:私はこの書き込みをする場合でも、

source/gui.c: In function ‘create_about_window’: 
source/gui.c:202:4: error: variable-sized object may not be initialized 
    const char *LABEL_TEXT[LABEL_NUMBER] = { 
    ^
source/gui.c:203:34: error: excess elements in array initializer [-Werror] 
            "Five or More", 
           ^
source/gui.c:203:34: note: (near initialization for ‘LABEL_TEXT’) 
source/gui.c:204:34: error: excess elements in array initializer [-Werror] 
            "By ... & ..." 
           ^
source/gui.c:204:34: note: (near initialization for ‘LABEL_TEXT’) 
source/gui.c:206:34: error: excess elements in array initializer [-Werror] 
            "April 2016", 
           ^
source/gui.c:206:34: note: (near initialization for ‘LABEL_TEXT’) 
source/gui.c:207:34: error: excess elements in array initializer [-Werror] 
            "~~ Thanks for playing ~~" 
           ^
source/gui.c:207:34: note: (near initialization for ‘LABEL_TEXT’) 

をだから私はちょうど私が、配列のサイズを設定するには、一定の符号なし整数を使用しながら、なぜgccのディスプレイにこのエラーを知りたいですか?

+0

[私のマシン上で動作](http://coliru.stacked-crooked.com/a/bb6ad14a4c89e222) –

+0

これはCコンパイラの動作に必要です。 'const unsigned LABEL_NUMBER = 4;'は変数ですが、値を変更しません。配列には2つの味があります。コンパイル時の整数定数(初期化可能)で固定されたサイズのもの、可変サイズ(初期化できないもの)のものです。 Cコンパイラ(C標準)では、後者は変数であるため、可変的に変更された配列を持ち、初期化子は使用できません。疑わしい場合は、 'enum {LABEL_NUMBER = 4};を使用してください。これはシンボルテーブルに表示されますが、配列の次元で使用できます。 –

+2

イニシャライザの2つの最短の文字列に文字列連結を使用することは好奇妙です。 2番目の二重引用符の後にカンマがないので、 "&..."、 "は、単一の文字列です) –

答えて

1

可変長配列は、初期化子を使用して初期化することはできません。

C11 - §6.7.9/ 3:

初期化するエンティティのタイプが未知のサイズまたは可変長配列型ない完全なオブジェクト型の配列でなければなりません。

+0

私はそれがコンパイルするのに驚いています:http://coliru.stacked-crooked.com/a/bb6ad14a4c89e222 –

+1

@MooingDuck; C++では、 'const'修飾されたオブジェクトは実際の定数リテラルとして扱われます(例外はあります)。 'g ++'を使ってコンパイルしています。これはC++コンパイラです。 – haccks

+0

しかし、LABEL_TEXT []がVLA、char * LABEL_TEXT [const ...] == char *(LABEL_TEXT [const ...])でない理由はわかりません。 – Maxime

0

あなたがマクロとしてLABEL_NUMBERを定義することができる: が生成するLABEL_NUMBER

const char *LABEL_TEXT[LABEL_NUMBER] 

が定義されているマクロ値で前処理段階で置き換えられる

#define LABEL_NUMBER 4 

そのように:

const char *LABEL_TEXT[4] 

コンパイラをコンパイルする。

+0

あなたの答えをありがとうが、それは本当に私が尋ねていたものではありません:) – Maxime

関連する問題