Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有“什么”呢;“移动目标”;GCC或Clang的别名值“-std=”,表示;使用最新标准;?_C++_C_Gcc_Clang - Fatal编程技术网

C++ 有没有“什么”呢;“移动目标”;GCC或Clang的别名值“-std=”,表示;使用最新标准;?

C++ 有没有“什么”呢;“移动目标”;GCC或Clang的别名值“-std=”,表示;使用最新标准;?,c++,c,gcc,clang,C++,C,Gcc,Clang,我想创建shell别名,它将始终使用由gcc/g++/clang/clang++/clang++(一个别名用于C,一个别名用于C++)支持的“最新”版本的C/C++标准。我意识到这可能有多种解释: 最新的GNU扩展标准 最新发布的标准(例如C++14) 最新未发布的标准(例如C++1z) 编译器完全实现的最新标准(例如,对于GCC 4.9,C++11;对于GCC 5+,C++14) 。。。可能还有其他我没想到的选择 …但是对于这些shell别名,我不太关心使用哪个“移动”值,只要我知道上面的

我想创建shell别名,它将始终使用由
gcc
/
g++
/
clang
/
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支持的模式是[explicit std modes…]和这些模式的各种别名”,但我看不到别名本身在哪里被记录在案。

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

但是,为包含适当设置的沙盒创建一个简单的Makefile是很容易的。我用这样的方式:

CFLAGS = -Wall -std=c11 -D_XOPEN_SOURCE_=700
CXXFLAGS = -Wall -std=c++14 -D_XOPEN_SOURCE_=700
默认构建规则满足了我的其余需求,因此无需在makefile中填入所有源文件的名称和依赖项,前提是我总是对单个可执行文件进行沙箱处理

这样,我就可以键入
makefoo
来编译
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)


虽然它也增加了成熟度。

如果gcc有一种方式,我想你会在文档中找到它。@KyleStrand我不是想听起来像是判断,但我真的无法想象在任何情况下这是必要的,甚至是有意义的。因此,我怀疑它是否可能。有趣的是——我没有意识到
make
会自动定义这样的目标(即,我认为这需要明确指定
foo
asa目标)。这并没有真正解决标准版本在更改时更新的问题。@kyle:确实如此。升级编译器时,需要升级makefile。(为了简化升级,我只使用了一个makefile和一堆符号链接。)它确实是一个“移动目标”,但我认为它离我想要的还很远;看来,即使在GCC 5.1中,默认C++语言是“代码> GNU+98 ,这是……,古人和非标准的。”KyLoStand:我同意,它也是唯一我知道的自动移动目标,不幸的是(情况比CGC要好得多,CyLand是有趣的,对于C代码,而不是C++)。目前C++的默认标准是“代码> -STD= GNU11</代码>,但对于C++,它是代码> -STD= GNU++ 98 @ USE3528 438:可能是因为C++ 11引入了重用关键字(<代码> Auto <代码>),并介绍了其他几个(<代码> DeCytys/COD>,<代码> NulLPTR )。所以冲突的可能性更大…看起来GCC6默认使用GNU-14。这是一个进步!我猜!