2014-09-19 60 views
7

我只是跳进C++,选自CC++阵列大小的声明和const

在C(九十〇分之八十九)到来,一个const实际上不是一个常数(而不是一个#define倒是,enum,或文字),而是只读一次设置。即,我可以:

const int x = rand(); 

这很好 - 点是x不知道,直到运行时。因此,我不能

int arr[x]; // error - x is not a compile-time constant 

然后,其中一个C标准(99?)继续前进,并允许可变长度数组。尽管我通常使用C语言来编写ANSI标准,但实际上我正在尝试拾取C++ 11,这实际上已经产生了影响。我知道,C++不允许变长数组。但是,许多编译器允许它作为扩展(GCC?)。问题是,现在我正在学习C++ 11,我不知道我编码是有效的C++,还是C++扩展了C99兼容性。例如:

std::default_random_engine e{}; 
std::uniform_int_distribution<int> d{}; 
const int x{d(e)}; 
int arr[x]; // compiles 

我不知道这是否是有效的C++或不。很显然,x的值只有在运行时才会知道。我想我可能不明白C和C++ const之间的区别?

+0

无效。使用标志'-std = ...',其中'...'是标准的,例如'C++ 11'或'C++ 98'。 – juanchopanza 2014-09-19 17:24:41

+2

您也可以使用'-pedantic' – Jarod42 2014-09-19 17:27:20

+0

@juanchopanza我实际上使用'-std = C++ 11'进行编译,并且clang没有产生任何警告。建议Shafik使用“pedantic”标志使警告弹出! – zac 2014-09-19 17:28:11

回答

9

你是正确的VLAs are a C99 feature在C11可选)和C++标准不包含这个功能虽然两者gccclang让他们在C++作为扩展。使用-pedantic标志,当您使用延长会警告

D1 [ constant-expressionopt] attribute-specifier-seqopt 
    ^^^^^^^^^^^^^^^^^^^^^^ 

对于这两种gccclang:我们可以看到他们不受要去draft C++11 standard部分8.3.4阵列它说允许的。如果你的目标是C++ 11,那么你也应该指定使用-std=c++11。您可以使用-pedantic-errors将警告转化为错误。如果您在使用-pedantic编译代码,你应该会看到以下警告:

warning: ISO C++ forbids variable length array 'arr' [-Wvla] 
int arr[x]; // compiles 
     ^

gcc记录了他们的各种标准,违约和标志强制执行标准的Language Standards Supported by GCC页面上的支持,并说:

要获得标准所需的所有诊断,您应该在 中指定-pedantic(或-pedantic-errors,如果您希望它们是 错误而不是警告)。

一般clang支持什么gcc做,但你可以找到他们的Language Compatibility网页上的更多细节。

GingerPlusPlus std:vector提到的注意事项被认为是C++中VLA的替代方案。

+0

奇妙!所以这似乎*是*使用C99扩展 – zac 2014-09-19 17:25:26

+0

感谢(非常快)的响应! – zac 2014-09-19 17:26:25

+0

感谢编辑以及..这使得它现在非常清楚 – zac 2014-09-19 17:31:47