C++中的VLA,扩展名为std=C++11

VLA in C++ with std=c++11 extension

本文关键字:std C++11 扩展名 中的 VLA C++      更新时间:2023-10-16

尽管提供了-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,因为存在由此启用的错误选项,后者不启用,反之亦然。

大胆的部分是我的重点——显然有些事情可能仍然会溜走。不过,我觉得这个选项足以满足我的需求。