2011-10-18 12 views
3

私はC++プログラマーであり、GCC "C"を扱うことはめったにありません。私は現在、GCCコンパイラで使用するためにC++からCへのコードを変換しています。C++の観点からの列挙

C++では、次のソースコードを使用します。スコープにクラスを使用することに注意してください。無クラスと二つの異なる "クラブ" キーワード間の差別のない方法での "C" で

C++ソース

class Card { 
public: 
    enum Suit { 
     Diamonds, Hearts, Clubs, Spades 
    }; 
}; 

class Weapon { 
public: 
    enum WeaponType { 
     Rocks, Clubs, Guns 
    }; 
}; 

int main() { 
Suit a = Card::Clubs; 
WeaponType b = Weapon::Clubs 
} 

。これをコンパイルしようとすると、次のエラーメッセージが表示されます。

エラーC2365:「クラブ」:再定義。以前の定義は 「列挙子」だった

Cソース

enum Suit { 
    Diamonds, Hearts, Clubs, Spades 
}; 

enum WeaponType { 
    Rocks, Clubs, Guns 
}; 

int main() { 
Suit a = Clubs; 
WeaponType b = Clubs 
} 

だから私の質問は、私は、同じキーワードを持つ同じファイルに二つの異なる列挙型を宣言するにはどうすればよい

  • はありますか?
  • スコープを列挙型に追加すると、異なる列挙型の変数に同じ列挙型の名前を割り当てることができます。

答えて

10

ちょうど昔のようにそれを実行します。

enum Suit { 
    ST_Diamonds, ST_Hearts, ST_Clubs, ST_Spades 
}; 

enum WeaponType { 
    WT_Rocks, WT_Clubs, WT_Guns 
}; 

int main() { 
Suit a = ST_Clubs; 
WeaponType b = WT_Clubs; 
return 0; 
} 
+0

1:Club_Suit、Club_Weapon:私はいつも最後にタイプを好んまさに私が –

+0

:-)投稿しようとしていましたそれは英語の構文に近いからです。私はClub_Weaponと一緒にClub_Buildingに向かいます。しかし、最終的に同じ違い。 –

+0

@Mooing Duck今日の終わりまでに、それはちょうど命名規則の好みです。それが意味を成して一貫している限り、それはうまくいくはずです:)私は接頭辞であることを説得的に好んでいます。英語では左から右に読むので、どのタイプに属しているのかはすぐにわかります。 – MGZero

3

これはCAリファレンスマニュアルから標準C.で行うことができません。「列挙定数として宣言された識別子は、変数と同じオーバーロードクラスであります関数とtypedefの名前 "であるため、列挙定数は指定されたスコープ内で一意でなければなりません。

2

によりCでの名前空間の不足のために、あなたの唯一のオプションは、前置されています

enum Weapon { 
    WeaponRocks, 
    WeaponSocks, 
    ... 
}; 
+0

+1 WeaponSocks :) – Patrik

関連する問題