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 别名,这些别名将始终使用 C/C++ 标准的 "latest" 版本,gcc
/g++
/clang
/clang++
(C 的一个别名,C++ 的一个别名)。我意识到这可能有多种解释:
- 最新的 GNU 扩展标准
- 最新发布的标准(例如 C++14)
- 最新未发布的标准(如C++1z)
- 编译器完全实现的最新标准(例如 GCC 4.9 的 C++11,GCC 5+ 的 C++14)
- ...可能还有其他我没有想到的选择
...但是为了这些 shell 别名的目的,我不在乎 使用哪个 "moving" 值只要据我所知,上述规则中的哪一条用于确定使用哪种标准模式。
这两个编译器是否包含跟踪移动的参数别名"latest standard"?我在 GCC 文档中没有看到任何别名选项的提及(尽管我的 google-fu 可能只是让我失望);同时,Clang 用户手册提到 "The supported modes for C are [explicit std modes...] and various aliases for those modes",但我看不到别名本身的记录位置。
你提到的任何编译器都没有这样的选项。
但是,为沙箱创建包含适当设置的简单 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
如果我不想要 link。)功能测试宏设置让我不必记住在我的源文件中也这样做。
并使用非默认编译器进行编译:make foo CXX=clang++
。这仍然比 clang++ -Wall -o foo foo.cc
少打字
(其实我用的那个比那个复杂一点,里面包含了.S
的后缀规则和一些变量来简化设置优化和调试选项,但是原理是一样的。)
最简单的解决方案是什么也不做,或者更具体地说,避免使用 -std=
。
编译器本身会随着版本的发布而提高其默认模式,通常是在开发人员对标准版本的实现充满信心时。这接近您的标准:
The latest standard fully implemented by the compiler (e.g. C++11 for GCC 4.9, C++14 for GCC 5+)
虽然也增加了成熟度。
我想创建 shell 别名,这些别名将始终使用 C/C++ 标准的 "latest" 版本,gcc
/g++
/clang
/clang++
(C 的一个别名,C++ 的一个别名)。我意识到这可能有多种解释:
- 最新的 GNU 扩展标准
- 最新发布的标准(例如 C++14)
- 最新未发布的标准(如C++1z)
- 编译器完全实现的最新标准(例如 GCC 4.9 的 C++11,GCC 5+ 的 C++14)
- ...可能还有其他我没有想到的选择
...但是为了这些 shell 别名的目的,我不在乎 使用哪个 "moving" 值只要据我所知,上述规则中的哪一条用于确定使用哪种标准模式。
这两个编译器是否包含跟踪移动的参数别名"latest standard"?我在 GCC 文档中没有看到任何别名选项的提及(尽管我的 google-fu 可能只是让我失望);同时,Clang 用户手册提到 "The supported modes for C are [explicit std modes...] and various aliases for those modes",但我看不到别名本身的记录位置。
你提到的任何编译器都没有这样的选项。
但是,为沙箱创建包含适当设置的简单 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
如果我不想要 link。)功能测试宏设置让我不必记住在我的源文件中也这样做。
并使用非默认编译器进行编译:make foo CXX=clang++
。这仍然比 clang++ -Wall -o foo foo.cc
(其实我用的那个比那个复杂一点,里面包含了.S
的后缀规则和一些变量来简化设置优化和调试选项,但是原理是一样的。)
最简单的解决方案是什么也不做,或者更具体地说,避免使用 -std=
。
编译器本身会随着版本的发布而提高其默认模式,通常是在开发人员对标准版本的实现充满信心时。这接近您的标准:
The latest standard fully implemented by the compiler (e.g. C++11 for GCC 4.9, C++14 for GCC 5+)
虽然也增加了成熟度。