2011-02-08 65 views
4

在文章中討論了以下代碼,並沒有認爲它是char *數組的標準C/C++語法。作爲測試,Visual C++(Visual Studio 2005)和C++ Builder Rad XE都拒絕第二行。C/C++ enum和char *數組

沒有使用#define s,任何人都有任何技巧/技巧保持enum s和字符串數組排序的同步,而不訴諸STL?

更多的好奇心問題。

enum TCOLOR { RED, GREEN, BLUE }; 

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

順便說一句,這來自於文章是很老,我相信這可能在GCC的工作,但還沒有測試。

+0

爲什麼不使用STL? – Kris 2011-02-08 15:14:34

+0

2個原因:1. STL導致代碼膨脹,2.我工作在STL通常不可用的嵌入式系統上。我的很多代碼文件都是純C(而不是C++),它必須在嵌入式平臺上編譯。 – Eric 2011-04-11 14:10:07

回答

7

這些是C99指定的初始值設定項。 GCC以C90模式(和C++)支持它們作爲擴展。閱讀在這裏:

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

還有就是要保持枚舉UND串同步沒有什麼好辦法。如果我真的需要這個,那麼我會寫一個腳本來從源代碼中獲取枚舉聲明並從中生成字符串數組。我真的很討厭用宏做這個。

更新:這是從去年開始,其中討論(在這種情況下打印)enum->字符串轉換問題

C++: Print out enum value as text

1

這是C99語法,什麼是海灣合作委員會的支持。您的要求

  • 沒有的#define
  • 沒有STL

你可能找不到同步。

1

我意識到這是一個老問題,但這可能會幫助其他人尋找一種簡單的方法來保持多個數組/枚舉同步。

就我而言,我只是想要一個編譯時檢查,以確定我的名單是否是不同步的,並且因爲sizeof操作符是不是直到後評估的預處理程序所做的這件事,這是最簡單的方法去做。

在某種形式的頭文件...

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

在相同的標題或其他一些文件也許......

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

在某處cpp文件...

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.自變量爲常數,這將通過零誤差生成編譯時間分當兩個計數變量不同。