我刚刚从C进入C++
在C(89/90)中,a const
实际上不是常量(与#define
'd 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_distributiond{}; const int x{d(e)}; int arr[x]; // compiles
我不知道这是否是有效的C++.显然,x
直到运行时才知道值.我想我可能不明白C和C++之间的区别const
?
你是正确的VLAS是C99功能(在C11可选)和C++标准不包含这个功能虽然两者gcc
并clang
允许他们在C++作为扩展.我们可以看到他们不允许进入草案C++ 11标准部分8.3.4
Arrays,它说:
D1 [ constant-expressionopt] attribute-specifier-seqopt ^^^^^^^^^^^^^^^^^^^^^^
对于两者而言gcc
,clang
使用该-pedantic
标志将在您使用扩展时发出警告.如果您的目标是C++ 11,那么您还应该指定使用-std=c++11
.您可以使用-pedantic-errors
将警告变为错误.如果您使用编译代码-pedantic
,则应看到以下警告:
warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[x]; // compiles ^
gcc
记录他们对各种标准,默认值和标志的支持,以强制执行GCC页面支持的语言标准标准,并说:
要获得标准所需的所有诊断,您还应指定-pedantic(或-pedantic-errors,如果您希望它们是错误而不是警告).
通常clang
支持什么gcc
,但您可以在其语言兼容性页面上找到更多详细信息.
请注意,如GingerPlusPlus std所述:vector被认为是C++中VLA的替代品.