2011-02-08 15 views
4

記事の次のコードに似ていて、char *配列の標準C/C++構文とは思わなかった。テストとして、Visual C++(Visual Studio 2005)とC++ Builder Rad XEの両方が2行目を拒否します。C/C++ enumとchar * array

#defineを使用せずに誰でもenumを保存するためのヒント/トリックがあり、STLに頼らずに文字列配列を同期させることはできますか?

その他の好奇心の質問です。

enum TCOLOR { RED, GREEN, BLUE }; 

char *TNCOLOR[] = { [RED]="Red", [GREEN]="Green", [BLUE]="Blue" }; 

脇に、この記事はかなり古く、これはGCCで動作するかもしれませんが、テストしていないと思います。

+0

なぜSTLを使用しないのですか? – Kris

+0

2つの理由:1. STLによってコードが肥大化する2.私はSTLが一般に利用できない組み込みシステムで作業する。私のコードファイルの多くは、組み込みプラットフォームでコンパイルする必要のある純粋なC(C++ではなく)です。 – Eric

答えて

7

これらはC99指定のイニシャライザです。 GCCは拡張としてC90モード(およびC++)でそれらをサポートしています。それについてここで読む:

http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits

同期して列挙型のウント文字列を維持するための良い方法はありません。これが本当に必要な場合は、ソースコードから列挙宣言を取得し、その配列から文字列配列を生成するスクリプトを作成します。マクロでこれを行うのは本当に嫌いです。

UPDATE:ここでは(この場合は印刷用)enum->文字列変換について説明し、昨年からの質問だ

C++: Print out enum value as text

+0

+1スクリプトです...私はおそらくマクロでスクリプトです:) –

1

これはGCCによってサポートされているものを、C99構文です。あなたの要件

  • なしの#define
  • 無STL

を使用すると、おそらく同期を見つけることができません。

1

これは古い質問ですが、これは複数の配列と列挙型を同期させるための簡単な方法を探している他の人にとって役に立ちます。

は、私の場合、私は単に私のリストが同期していたかどうかを判断するためにコンパイル時のチェックをしたかった、と後プリプロセッサが、それはことだ、これが最も簡単な方法だったんまで、sizeof演算子は評価されませんので、それを行う。おそらく、ある種のヘッダファイルに

...同じヘッダまたはいくつかの他のファイルで

enum ColorType 
{ 
    Red=0, 
    Blue, 
    Green, 
    ColorType_Max 
}; 

...どこかのCPPファイルで

char const* ColorTypeNames[]= 
{ 
    "Red", 
    "Blue", 
    "Green" 
}; 

...2つのサイズが一致のみ

const int s_ColorTypeCount = (int)ColorType_Max; 
const int s_ColorNameCount = (int)(sizeof(ColorTypeNames)/sizeof(char const*)); 
const int s_ColorErrorA = 1/(s_ColorTypeCount/s_ColorNameCount); 
const int s_ColorErrorB = 1/(s_ColorNameCount/s_ColorTypeCount); 

、s_ColorErrorAとs_ColorErrorB変数は定数であるので、両カウント変数が異なる場合、これはゼロエラーによってコンパイル時分割を生成する1に等しくなります。