我跑过这样的C代码:
static char *mem_types[M_CNT] = {
[M_ABC] = "abc",
[M_DEF] = "DEF",
[M_XYZ] = "XYZ",
};
M_CNT是一个宏常数; M_ABC,M_DEF和M_XYZ都是枚举。
这样的声明对我来说很奇怪,或者说,我想知道声明像这样的字符串数组有什么好处。我只想把它作为
static char *mem_types[M_CNT] = {
"abc",
"DEF",
"XYZ",
};
我唯一能想到的是,声明可以准确地限制每个字符串的大小。
还有其他考虑吗?
答案 0 :(得分:3)
这使您的代码免于重新排序枚举值。以下是其工作原理的说明:
#include <stdio.h>
enum {
aa, bb, cc
};
static char *mem_types[3] = {
[aa] = "abc",
[cc] = "DEF",
[bb] = "XYZ",
};
int main() {
int i;
for (i = 0 ; i != 3 ; i++) {
printf("%s\n", mem_types[i]);
}
}
这是程序打印的内容。请注意XYZ
和DEF
如何切换地点以匹配enum
的顺序。
abc
XYZ
DEF
答案 1 :(得分:1)
如果可能不时在数组中插入新行,则[M_ABC]
版本将保证枚举值与相应数据在数组中的位置保持一致。此外,它向阅读此代码的任何开发人员提供信号,表明枚举肯定仍与实际数组定义同步。
这比在某个地方使用代码引用(比如mem_types[1]
并且必须弄清楚它是否试图引用魔法常量1的旧含义或新含义更可取。