2011-01-28 11 views
0

HIすべて 私はこのコードをCプロジェクトから取り出しました。私はg ++の下でそれをコンパイルすることはできません。なぜこのC配列初期化はg ++でコンパイルされませんか?

これで何ができますか?

enum EnumIndexID{ 
     ID_VALUE_A=2, 
     ID_VALUE_B=2 
} 

struct newtype { 
    enum MyEnumID eid; 
    const char *name; 
} table[] = { 
    [ID_VALUE_A] = { MyEnumA, "ID_MSG_HeartbeatReq"}, 
    [ID_VALUE_B] = { MyEnumB, "ID_MSG_HeartbeatReq"}, 
}; 
+1

これは、純粋なCのコードであれば、私はC++のタグが属しているとは思いません。 – BoltClock

+2

どのようなエラーが表示されますか? – BlackBear

+2

あなたはコンパイルエラーが何を受け取っているのかを言及していませんか? – programmer

答えて

5

以下はC99(注:それはC89として有効ではありません):として罰金コンパイル

enum MyEnumID { 
    MyEnumA, MyEnumB 
}; 

enum EnumIndexID{ 
    ID_VALUE_A=2, 
    ID_VALUE_B=2 
}; 

struct newtype { 
    enum MyEnumID eid; 
    const char *name; 
} table[] = { 
    [ID_VALUE_A] = { MyEnumA, "ID_MSG_HeartbeatReq"}, 
    [ID_VALUE_B] = { MyEnumB, "ID_MSG_HeartbeatReq"}, 
}; 

int main() { return 0; } 

EDIT:他の人がID_VALUE_AID_VALUE_Bはおそらくだ同じ値、すなわち2であることを指摘していますあなたのコードのバグ。しかしgccはこれを受け入れます。

乾杯& HTH。、

+0

GCCドキュメントに明示されているように、C++としてコンパイルされません。 –

+0

したがって、正しいGCC設定は、-std = gnu99またはstd = c99のいずれかになります。 – Lundin

+0

あなたはこれがおそらくバグかもしれませんが、標準に準拠しています。 AFAIRは、勝利した最後の初期化です。 –

-1

だけでなく、あなたは、少なくともエントリポイントが必要になります。

int main() { 
.... lots of other code ... 
} 
+0

コンパイルするのではなく、リンクするだけで(プロジェクトがアプリケーションの場合のみ)必要です。 –

+0

@Sergey、本当に、私の謝罪....私はこれがスタンドアロンのアプリだと仮定していた。 – ennuikiller

0

あなたが最初に列挙型定義の後にセミコロンが欠落しています。

編集

また

、何らかの理由でit turns out that this syntax is supported by GCC but isn't supported by G++

struct newtype { 
    enum MyEnumID eid; 
    const char *name; 
} table[] = { 
    { MyEnumA, "ID_MSG_HeartbeatReq"}, 
    { MyEnumB, "ID_MSG_HeartbeatReq"}, 
}; 

EDIT::私は指定された初期化について学んできた今日を

0

別にenum定義の後にセミコロンから、table[]宣言 は、G ++でコンパイルされません構文的に正しくありません。

+3

セミコロン(もちろんMyEnumIDの定義)を追加した後は、G ++で構文的に正しくコンパイルできます。私は、コンパイラが指定されたイニシャライザで重複インデックスをどのように処理するかについてはあまり理解していません。 –

+0

申し訳ありませんが、私はそれが少し間違っています。明らかにGCCによってサポートされていますが、G ++ではサポートされていません。それは純粋なCコードだったので、最初はG ++を使用しませんでした。 –

+0

Yeap、私も、指定されたイニシャライザについて学んだことがあります。 – vz0

6

コンパイラがDesignated Initializer構文をサポートしていることを確認してください。

g ++はありません。そのハイパーリンクから :

標準C89が初期化される配列または構造の要素の順序と同じで、固定された順序で表示される初期化子の要素を必要とします。

ISO C99では、配列のインデックスや構造体フィールド名を指定して任意の順序で要素を与えることができ、GNU CではこれをC89モードの拡張子としても使用できます。 この拡張はGNU C++では実装されていません。

+0

+1指定初期化子 – vz0

+0

これは、少なくとも古いDev C++ 4.9.9.2で実装されています。おそらく間違ったコンパイラ設定を使用していますか? – Lundin

+0

Dev-C++はGCCのmingwポートを使用します - おそらく、指定された初期化子がポートでサポートされていますか?彼はコンパイラや彼の環境について具体的には触れていない。私はまだこれが問題だと思っています。 – razlebe

関連する問題