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"?
我想创建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.c
或foo.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)
虽然它也增加了成熟
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- C++ "error: invalid use of void expression"
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 表示类模板C++空类型
- 具有所表示类的相同构造函数签名的代理类模板
- 嵌套在循环中的两个循环的 big-O 表示法
- GCC 或 Clang '-std=' 是否有任何"moving target"别名值,表示"use the latest standard"?