看看下面的代码,
此代码可以正常编译:
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?有人请澄清。
答案 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初始化
要初始化的实体的类型应为未知数组 大小或不是可变长度数组类型的对象类型