我只是想知道为什么这在Clang 4.0中有效:
unsigned cnt = 42;
int k[cnt];
但这不会:
unsigned cnt = 42;
string bad[cnt];
我刚刚查看了C ++入门第5版。它说:
维度必须在编译时知道,这意味着 维度必须是常量表达式
如果这是真的,为什么int k[cnt];
有效?
答案 0 :(得分:14)
这两个代码段都不适用于C ++。
但是,在C中,可以使用非常量表达式作为数组大小。一些编译器(例如,没有-pedantic
选项的GCC)支持C ++代码中的C功能。
至于元素类型之间的区别,它是特定于编译器的。海湾合作委员会汇编两者。在这种情况下,clang ++禁止非POD类型(例如std::string
)。
答案 1 :(得分:0)
你使用什么编译器,我使用的是gcc,const和nonconst都可以正常工作。
这不是c的问题,数组不是通过变量来定义的,只是通过宏和const表达式来定义。
这是编译器解释的问题,我怀疑它与标准有关。
答案 2 :(得分:0)
clang 4.0实际上是苹果xcode clang吗?我认为这实际上是版本3.1。 clang本身提供了一个很好的解释:
warning: variable length arrays are a C99 feature
[-Wvla-extension]
int k[cnt];