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