【发布时间】:2019-07-21 03:48:38
【问题描述】:
看看下面的代码,
这段代码编译得很好:
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?有人请澄清。
【问题讨论】:
-
您不能拥有静态或全局 VLA
-
@Jabberwocky 为什么第二种情况是 VLA,但第一种不是?
-
因为
NUM_IDS是一个编译时间常数。nr_names不是 -
这就是为什么在 C++11 中引入
constexpr。 -
nr_names直到运行时才知道。static char* const names[nr_names]在编译时需要一个数组大小。您希望nr_names在编译时具有什么值?
标签: c constants variable-length-array