C / C ++枚举和char *数组

时间:2011-02-08 15:12:54

标签: c++ c enums char

在一篇文章中讨论以下代码并且不认为它是char *数组的标准C / C ++语法。作为测试,Visual C ++(visual studio 2005)和C ++ Builder Rad XE都拒绝第二行。

在不使用#define的情况下,任何人都有任何技巧/提示可以保持enum和字符串数组同步,而无需诉诸STL?

更多的好奇心问题。

enum TCOLOR { RED, GREEN, BLUE };

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

顺便说一下,这篇文章来自于相当陈旧,我相信这可能会在海湾合作委员会下工作,但尚未经过测试。

4 个答案:

答案 0 :(得分:7)

这些是C99指定的初始化程序。 GCC在C90模式(以及在C ++中)支持它们作为扩展。在这里阅读:

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

没有好办法让enums和字符串保持同步。如果我真的需要这个,那么我会编写一个脚本来从源代码中获取枚举声明并从中生成字符串数组。我真的很讨厌用宏来做这件事。

更新:这是去年的一个问题,讨论了enum->字符串转换(在这种情况下用于打印)

C++: Print out enum value as text

答案 1 :(得分:4)

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

允许在C99中,在C ++ 03,C ++ 0x或任何其他版本的C中

了解Designated initializers for aggregate types - C99

答案 2 :(得分:1)

这是C99语法,GCC支持的内容。满足您的要求

  • 没有#define
  • 没有STL

你可能找不到同步。

答案 3 :(得分: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.由于变量是常量,当两个计数变量不同时,这将产生编译时除以零错误。