GCC 或 Clang '-std=' 是否有任何"moving target"别名值,表示"use the latest standard"?

Are there any "moving target" alias-values for GCC or Clang `-std=`, implying "use the latest standard"?

本文关键字:表示 use standard 别名 latest the GCC -std Clang 是否 moving      更新时间:2023-10-16

我想创建shell别名,它将始终使用gcc/g++/clang/clang++支持的"最新"版本的C/c++标准(一个别名为C,一个别名为c++)。我意识到这可能有多种解释:

  • 最新的gnu扩展标准
  • 最新发布标准(如c++ 14)
  • 最新未发布的标准(如c++ 1z)
  • 编译器完全实现的最新标准(例如GCC 4.9的c++ 11, GCC 5+的c++ 14)
  • …可能还有其他我没有想到的选择

…但是对于这些shell别名的目的,我不太关心使用了哪个"移动"值,只要我知道使用了上述哪个规则来确定使用了哪个标准模式。

编译器是否包含一个参数别名来跟踪移动的"最新标准"?我在GCC文档中没有看到任何提到别名选项(尽管我的google-fu可能只是让我失望);同时,Clang用户手册提到"C支持的模式是[显式std模式…]和这些模式的各种别名",但我没有看到别名本身的文档

在您提到的任何编译器中都没有这样的选项。

然而,为沙盒创建一个简单的Makefile是很容易的,它包含了适当的设置。我使用如下代码:

CFLAGS = -Wall -std=c11 -D_XOPEN_SOURCE_=700
CXXFLAGS = -Wall -std=c++14 -D_XOPEN_SOURCE_=700

默认的构建规则完成了我的其余需求,所以没有必要用所有源文件的名称和依赖项填充makefile,只要我总是对单个文件可执行文件进行沙箱。

有了这个,我可以输入make foo来编译foo.cfoo.cc。(或者make foo.o,如果我不想要链接。)功能测试宏设置也节省了我在源文件中进行测试的时间。

并使用非默认编译器:make foo CXX=clang++进行编译。这仍然比clang++ -Wall -o foo foo.cc

少输入

(实际上我用的比这更复杂一点。它包括.S的后缀规则和一些变量,以简化设置优化和调试选项。但原理是一样的

最简单的解决方案是什么都不做,或者更具体地说,避免使用-std=

编译器自己会在发行版通过时提高默认模式,通常是在开发人员对标准版本的实现有信心时。这很接近你的标准:

编译器完全实现的最新标准(例如GCC 4.9的c++ 11, GCC 5+的c++ 14)

虽然它也增加了成熟