有无名数组有什么好处/考虑因素

时间:2012-01-22 02:10:47

标签: c

我跑过这样的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",
};   

我唯一能想到的是,声明可以准确地限制每个字符串的大小。

还有其他考虑吗?

2 个答案:

答案 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]);
    }
}

这是程序打印的内容。请注意XYZDEF如何切换地点以匹配enum的顺序。

abc
XYZ
DEF

答案 1 :(得分:1)

如果可能不时在数组中插入新行,则[M_ABC]版本将保证枚举值与相应数据在数组中的位置保持一致。此外,它向阅读此代码的任何开发人员提供信号,表明枚举肯定仍与实际数组定义同步。

这比在某个地方使用代码引用(比如mem_types[1]并且必须弄清楚它是否试图引用魔法常量1的旧含义或新含义更可取。