在编译C/C++代码时,可以使用要选择语言标准,比如要使用C++11,也就是2011年发布的ISO C++标准,来编译test.cpp文件:
$ g++ -o test test.cpp-std=c++11
这个选项用来确定语言标准。参见GCC支持的语言标准来了解这些标准版本的细节:Standards (Using the GNU Compiler Collection (GCC)).
这个选项目前只在编译C或C++时支持。
编译器可以接受几种基本标准,如'c90'或'c++98',以及这些标准的GNU定制版(dialects ),如'gnu90'或'gnu++98'。当指定了一个基本标准时,编译器会接受所有遵循该标准的程序,以及那些使用GNU扩展的、与该标准不矛盾的程序。例如,-std=c90会关闭GCC中某些与ISO C90不兼容的功能,如asm和typeof关键字,但不会关闭其他在ISO C90中没有意义的GNU扩展,如省略?:表达式的中间项。另一方面,当一个标准的GNU定制版被指定时,编译器所支持的所有特性都被启用,即使这些特性改变了基础标准的含义。因此,一些严格符合标准的程序可能会被拒绝。指定语言标准版本后,后面加上“ -Wpedantic” 选项来识别哪些特性是在该版本标准下的 GNU 扩展。例如,“-std=gnu90 -Wpedantic”会警告C++风格的'//'注释,而“-std=gnu99 -Wpedantic”则不会。
该选项需要提供一个值,可以使用的值如下:
'c90'
'c89'
'iso9899:1990'
支持所有的ISO C90程序(某些与ISO C90冲突的GNU扩展被禁用)。与C代码的-ansi相同。
'iso9899:199409'
在修正案1中修改的ISO C90。
'c99'
'c9x'
'iso9899:1999'
'ISO9899:199x'
ISO C99。这个标准基本上是所有编译器完全支持的,除了错误和浮点问题(主要但不完全与附件F和G的可选C99功能有关)。更多信息见Status of C99 features in GCC- GNU Project。”c9x“ 和 "iso9899:199x "这两个名称已被废弃。
'c11'
'c1x'
'iso9899:2011'
ISO C11,是ISO C标准的2011年修订版。这个标准基本上是所有编译器完全支持的,除了错误、浮点问题(主要但不完全与附件F和G的可选C11特性有关)和可选附件K(边界检查接口)和L(可分析性)。名称'c1x'已被废弃。
'c17'
'c18'
'iso9899:2017'
'iso9899:2018'
ISO C17,是ISO C标准的2017年修订版(2018年出版)。这个标准与C11相同,除了对一些缺陷的修正(所有这些修正也已应用于-std=c11),还有__STDC_VERSION__增加了一个新值,所以支持程度与C11相同。可以看作和C11一样。
'c2x'
ISO C标准的下一个版本,仍在开发中。对这个版本的支持是试验性的,不完整的。
'gnu90'
'gnu89'
ISO C90的GNU定制版(包括一些C99特性)。
'gnu99'
'gnu9x'
ISO C99 的 GNU 定制版。名称'gnu9x'已被弃用。
'gnu11'
'gnu1x'
ISO C11的GNU 定制版。名称'gnu1x'已被弃用。
'gnu17'
'gnu18'
ISO C17的GNU 定制版。这是C代码的默认使用选项。
'gnu2x'
ISO C标准的下一个版本,仍在开发中,还包括GNU扩展。对这个版本的支持是试验性的,不完整的。
'c++98'
'c++03'
1998年的ISO C++标准加上2003年的技术更正和一些额外的缺陷报告。与C++代码的-ansi相同。
'gnu++98'
'gnu++03'
-std=c++98的GNU定制版。
'c++11'
'c++0x'
2011年的ISO C++标准加上修正案。'c++0x'这个名字已被废弃。
'gnu++11'
'gnu++0x'
-std=c++11的GNU定制版。名称'gnu++0x'已被弃用。
'c++14'
'c++1y'
2014年的ISO C++标准加上修正案。名称'c++1y'已被弃用。
'gnu++14'
'gnu++1y'
GNU方言的-std=c++14。名称'gnu++1y'已被弃用。
'c++17'
'c++1z'
2017年的ISO C++标准加上修正案。名称'c++1z'已被弃用。
'gnu++17'
'gnu++1z'
GNU定制版的-std=c++17。这是对C++代码的默认使用选项。名称'gnu++1z'已被废弃。
'c++20'
'c++2a'
2020年的ISO C++标准加上修正案。支持是实验性的,在未来的版本中可能会有不兼容的变化。名称'c++2a'已被弃用。
'gnu++20'
'gnu++2a'
-std=c++20 的 GNU 定制版。支持是试验性的,在未来的版本中可能会有不兼容的变化。名称'gnu++2a'已被弃用。
'c++2b'
'c++23'
ISO C++标准的下一个修订版,计划于2023年发布。支持是高度实验性的,在未来的版本中几乎肯定会有不兼容的变化。
'gnu++2b'
'gnu++23'
-std=c++2b 的 GNU 定制版。支持是高度实验性的,在未来的版本中几乎肯定会发生不兼容的变化。
参考: