问题描述
我只是跳进C ++,从C来
I'm just jumping into C++, coming from C
在C(89/90),一个常量
实际上不是一个常数(而不是一个的#define
'D,枚举
,或文字),而是只读设置一次。即,我可以:
In C (89/90), a const
is not actually a constant (as opposed to a #define
'd, enum
, or literal), but rather read-only once set. I.e, I can:
const int x = rand();
这很好 - 点是 X
不知道,直到运行时。因此,我不能
and that's fine - the point being x
isn't known until runtime. Hence, I can't
int arr[x]; // error - x is not a compile-time constant
然后,对C类标准(99?)一个人去前进,允许变长数组。虽然我通常code对C中的ANSI标准,这实际上已经产生了影响,现在我想以皮卡C ++ 11。
Then, one of the C standards (99?) went ahead and allowed for variable-length arrays. Although I normally code against the ANSI standard in C, this has actually had an impact now that I am trying to pickup C++11.
据我所知,C ++不允许变长数组。然而,许多编译器允许它作为一个扩展(GCC?)。问题是,现在我想学习C ++ 11,如果有什么我编码为有效的C我不能告诉++或C ++扩展了C99兼容。例如:
As far as I know, C++ does not allow for variable-length arrays. However, many compilers allow it as an extension (GCC ?). The problem is, now that I am trying to learn C++11, I can't tell if what I'm coding is valid C++, or C++ extended with C99-compatibility. Ex:
std::default_random_engine e{};
std::uniform_int_distribution<int> d{};
const int x{d(e)};
int arr[x]; // compiles
我不知道这是否是有效的C ++或没有。显然, x的值
不知道,直到运行时。我想我可能不理解C和C之间的差异++ 常量
?
I can't tell if this is valid C++ or not. Clearly, the value of x
is not known until runtime. I think I may not understand the difference between C and C++ const
?
推荐答案
您是否正确(的在C11 的),而C可选++标准不包含这个功能虽然两者 GCC
和铛
让他们在C ++的扩展。我们可以看到,他们不是要去部分 8.3.4
的阵列的它说:
You are correct VLAs are a C99 feature(optional in C11) and the C++ standard does not include this feature although both gcc
and clang
allow them in C++ as an extension. We can see they are not allowed by going to the draft C++11 standard section 8.3.4
Arrays which says:
D1 [ constant-expressionopt] attribute-specifier-seqopt
^^^^^^^^^^^^^^^^^^^^^^
对于 GCC
和铛
使用 -pedantic
标志,当您使用延长警告。如果你的目标C ++ 11,那么你也应该指定使用 -std = C ++ 11
。您可以使用 -pedantic-错误
打开警告走入误区。如果您在使用编译code -pedantic
您应该看到以下警告:
For both gcc
and clang
using the -pedantic
flag will warn when you are using an extension. If you are targeting C++11 then you should also specify that using -std=c++11
. You can use -pedantic-errors
to turn the warning into errors. If you compile your code using -pedantic
you should see the the following warning:
warning: ISO C++ forbids variable length array 'arr' [-Wvla]
int arr[x]; // compiles
^
GCC
记录了他们的各种标准,违约和标志的支持强制执行的标准对他们的页面的支持,并说:
gcc
documents their support for various standards, defaults and flags to enforce standard on their Language Standards Supported by GCC page and it says:
要获得所有标准所要求的诊断,你应该
如果你希望他们能同时指定-pedantic(或者-pedantic-错误
错误,而不是警告)。
在一般铛
支持什么 GCC
做,但你可以找到他们的页
In general clang
supports what gcc
does but you can find more details on their Language Compatibility page.
请注意由GingerPlusPlus提到被认为是替代的VLA在C ++中。
Note as mentioned by GingerPlusPlus std:vector is considered the alternative for VLA in C++.
这篇关于C ++数组大小声明和const的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!