是否存在GCC或Clang` -std =`的“移动目标”别名值,暗示“使用最新标准”?

时间:2015-09-09 16:26:44

标签: c++ c gcc clang

我想创建shell别名,它总是使用gcc / g++ / clang / {{1}支持的C / C ++标准的“最新”版本(C的一个别名,C ++的一个别名)。我意识到这可能有多种解释:

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

....但是出于这些shell别名的目的,我并不在乎使用哪个“移动”值,只要我知道上述哪些规则用于确定使用哪种标准模式。

两个编译器是否都包含跟踪移动“最新标准”的参数别名?在GCC文档中我没有看到任何提及别名选项(虽然我的google-fu可能只是让我失望);同时,Clang用户手册提到“C支持的模式是[显式std模式......]和这些模式的各种别名”,但我没有看到别名本身的记录位置。

2 个答案:

答案 0 :(得分:1)

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

但是,为沙盒创建一个包含适当设置的简单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如果我不想要链接。)功能测试宏设置使我不得不记得在我的源文件中也这样做。

使用非默认编译器进行编译:{{1​​}}。打字的次数仍然少于make foo CXX=clang++

(实际上我使用的那个比它更复杂。它包括clang++ -Wall -o foo foo.cc的后缀规则和一些变量以简化设置优化和调试选项。但原理是相同的。)

答案 1 :(得分:0)

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

一旦开发人员对其标准版本的实施充满信心,编译器本身就会在发布版本时提升默认模式。这符合您的标准:

  

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

虽然它也增加了成熟度。