C/C++ 枚举和字符指针数组

4
在一篇文章中看到以下代码,我认为它不是标准的C/C++ char*数组语法。作为测试,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" };

作为一件附带事项,这篇文章相当古老,我认为这可能适用于GCC,但尚未测试。

两个原因:1. STL会导致代码膨胀,2. 我工作的是嵌入式系统,通常不使用STL。我的很多代码文件都是纯C(不是C++),必须在嵌入式平台上编译。 - Eric
4个回答

7
这些是C99指定的初始化程序。 GCC支持它们在C90模式下(以及在C ++中)作为扩展。 在这里阅读有关此的详细信息: http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits
没有好的方法来保持枚举和字符串同步。 如果我真的需要这个,那么我会编写一个脚本从源代码中获取枚举声明,并从中生成字符串数组。 我真的不喜欢用宏做这件事。
更新:这里是去年的一个问题,讨论了枚举->字符串转换(在此情况下用于打印) C++:将枚举值作为文本打印出来

+1 for脚本编写...虽然我可能会使用宏来编写脚本 :) - Matthieu M.

4

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。由于这些变量是常量,当两个计数变量不同时,这将生成编译时的除零错误。

1

这是C99语法,被GCC所支持。根据您的要求:

  • 没有#define
  • 没有STL

您可能不会找到一个同步方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接