枚举长度的数组大小给出编译错误

时间:2019-02-27 12:11:36

标签: c

看看下面的代码,

此代码可以正常编译:

enum ids {
    X,
    Y,
    NUM_IDS,
}

void some_func(void)
{
    static char* const names[NUM_IDS] = { "name X" , "name Y"};
}

但是此代码无法编译: 错误:“名称”的存储大小不固定

enum ids {
    X,
    Y,
    NUM_IDS,
}

void some_func(void)
{
    int nr_names = NUM_IDS;
    static char* const names[nr_names] = { "name X" , "name Y"};
}

我认为我误解了常量表达式的含义。是否以第二种方式变成了C90中不存在的VLA?有人请澄清。

2 个答案:

答案 0 :(得分:3)

static char* const names[nr_names]是VLA,因为nr_names不是常量表达式,而是(非常量)int。当然,在这个简短的示例中,它始终等于NUM_IDS,但是您仍然不能这样做。


在不相关的旁注中,建议将char定义为const,因为对其进行修改是不可行的,因为它是程序二进制文件的一部分(在C ++中,它不允许您拥有非常量):

static const char* const names[NUM_IDS] = { "name X" , "name Y" };

答案 1 :(得分:1)

问题是不允许VLA具有静态存储期限

引用ISO 9899 6.7.5.2数组声明符

  

如果声明标识符为具有静态存储的对象   持续时间,它不能具有可变长度的数组类型。

因此,通常不允许您声明静态VLA。由于nr_names不是常量,因此不允许在第二个代码中使用static。

第一个代码是正确的,因为NUM_IDS是常量表达式。

第二个代码的另一个问题是无法初始化VLA。

我引用了ISO 9899 6.7.8初始化

  

要初始化的实体的类型应为未知数组   大小或不是可变长度数组类型的对象类型