2011-02-08 119 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.自变量为常数,这将通过零误差生成编译时间分当两个计数变量不同。