C++中的VLA,扩展名为std=C++11
VLA in C++ with std=c++11 extension
尽管提供了-std=c++11
编译选项,VLA在C++中是如何工作的。根据GCC:
ISO C99中允许使用可变长度的自动数组,GCC在C90模式和C++中接受这些数组作为扩展。
#include<iostream>
using namespace std;
int fun()
{
int j;
cin>>j;
return j;
}
int main()
{
const int i=fun();
int j[i];
return 0;
}
正如Jonathan在评论中提到的,gcc有pedantic
选项,也不允许扩展:
-Wpedantic
-pedantic
发布严格的ISO C和ISO C++要求的所有警告;拒绝所有使用禁用扩展名的程序,以及其他一些程序不遵循ISO C和ISO C++的程序。对于ISO C,请遵循所使用的任何
-std
选项指定的ISO C标准的版本。有效的ISO C和ISO C++程序应该在有或没有此选项的情况下正确编译(尽管少数程序需要
-ansi
或-std
选项指定所需的ISO C版本(。然而,如果没有这个选项,某些GNU扩展以及传统的C和C++功能也得到了支持。有了这个选项,他们就会被拒绝。
-Wpedantic
不会因使用名称以"__
"开头和结尾的备用关键字而引发警告消息。此备用格式也可用于禁用非ISO"__intN
"的警告类型,即"__intN__
"。教育警告也在CCD_ 12之后的表达式。但是,只有系统标头文件应该使用这些逃生路线;应用程序应该避开他们。请参见备用关键字。一些用户尝试使用
-Wpedantic
来检查程序是否严格符合ISO C。他们很快发现它并不像他们做的那样want:它发现了一些非ISO实践,但不是全部——只有那些哪些ISO C需要诊断,以及其他一些已添加诊断在某些情况下,报告任何不符合ISO C的功能可能很有用,但需要相当多的附加功能工作,并且将与CCD_ 14大不相同。我们没有计划以在不久的将来支持这样的功能。
如果用
-std
指定的标准表示C的GNU扩展方言,例如"gnu90
"或"gnu99
",则存在对应的基本标准,GNU扩展方言所依据的ISO C版本基于。-Wpedantic
在需要的地方发出警告按照基本标准。(这样的警告毫无意义仅针对非指定GNU C方言中的功能给出,因为定义C的GNU方言包括编译器的所有功能支持给定的选项,并且不会有任何警告大约。(
-pedantic-errors
只要基本标准(参见
-Wpedantic
(需要诊断,在某些情况下,在编译时,以及在其他一些情况下不妨碍编译根据标准有效的程序的数量。这不是等效于-Werror=pedantic
,因为存在由此启用的错误选项,后者不启用,反之亦然。
大胆的部分是我的重点——显然有些事情可能仍然会溜走。不过,我觉得这个选项足以满足我的需求。
- C++中的VLA,扩展名为std=C++11
- 编译器不会使用 -std=c++11 编译智能指针
- C ++枚举范围无法使用-std=c ++ 98进行编译,但使用-std=c ++ 11可以
- std::使用 -std=gnu++11 开关编译时相等错误
- "unix" C++预处理器宏未定义 -std=c++11
- 用STD = C 11或其他标准编译Boost,例如Ash C 14
- 网站组装 |错误:'C/ObjC'不允许使用无效'-std=c++11'参数
- G++ - 警告:扩展初始值设定项列表仅适用于 -std=C++11 或 -std=GNU++11
- 如何避免每次编译时都必须键入 -std=c++11
- 无法用"-std=c++11"编译《你好世界》
- 无法在Eclipse Neon.3中同时使用-std = C 11和-l/-l选项
- Cython -STD = C 11错误,使用C和C
- 扩展初始化器列表仅可用-STD = C 11或-STD = GNU 11中的C
- 为什么将语言标准从-STD = GNU 98到-STD = GNU 11
- 为什么 std::move 未定义,尽管编译器使用 -std=c++11 调用
- 我可以安全地将编译的库与-STD = C 11和-STD = C 14
- MATLAB MEX:-STD = C 11使用,但MEX错误仍然是错误
- Makefile with -std=c++11
- CUDA 8 编译错误与 -std=gnu++11
- QT 5.7将-STD = GNU 11添加到我的编译器标志,Clobbering -Std = C 14