C++ 使用变量作为C+;中数组的维数+;?
我只是想知道为什么这在Clang 4.0中有效:C++ 使用变量作为C+;中数组的维数+;?,c++,arrays,c++11,dimension,C++,Arrays,C++11,Dimension,我只是想知道为什么这在Clang 4.0中有效: unsigned cnt = 42; int k[cnt]; 但这不会: unsigned cnt = 42; string bad[cnt]; 我刚刚检查了C++入门第五版。它说: 维度必须在编译时已知,这意味着 维度必须是常量表达式 如果这是真的,为什么intk[cnt]工作
unsigned cnt = 42;
int k[cnt];
但这不会:
unsigned cnt = 42;
string bad[cnt];
我刚刚检查了C++入门第五版。它说:
维度必须在编译时已知,这意味着
维度必须是常量表达式
如果这是真的,为什么
intk[cnt]代码>工作在C++中,代码段都不工作。
然而,在C语言中,可以使用非常量表达式作为数组大小。一些编译器(例如,GCC没有<代码> -PoANTICTIC/<代码>选项)支持C++代码中的C特性。
至于元素类型之间的区别,它是特定于编译器的。GCC同时编译这两个文件。在这种情况下,clang++禁止使用非POD类型(例如std::string
)。您使用的编译器是什么,我使用的是gcc,常量和非常量都可以正常工作
这不是c语言的问题,数组不是通过变量定义的,只有宏和常量表达式
这是编译器的解释问题,我怀疑它与标准有关。Clang4.0实际上是apple xcode clang吗?我认为这实际上是3.1版。叮当声本身提供了一个很好的解释:
warning: variable length arrays are a C99 feature
[-Wvla-extension]
int k[cnt];
const unsigned cnt=42
@AustinBrunkhorst我知道我应该使用const
。我只是想知道为什么intk[cnt]代码>有效,但字符串k[cnt]
无效。。这是继承自C
的历史问题吗?不要这样做。你想要的是(当然)std::vector(42)在这种情况下,甚至比const更好的是conExPR。似乎CLAN不符合C++,可能是一些扩展到C99 VLAB垃圾到C++(这可能是它为什么不工作的原因)。C++ 11不支持它。但是,该特性计划用于C++14或C++17。与C99/C11虽然有一些限制,但Morwenn正在考虑(毕竟,它是许多C++实现的现有实践),Stroustup是这样的,只要指针类型可以被固定(在C中,指向VLA元素的指针与指向常规数组元素的指针不兼容)是的。而且,如果我没有错的话,他们也考虑不把<代码> sieOfs<代码>的运行时间移植。