我发现在我们的一个项目中,我们使用如下的编译命令:
g++ -ansi -std=c++0x ...
同时使用标记-ansi
和-std=c++0x
吗?
我为gcc读过man,看起来我们只能选择一个标志。你觉得怎么样?
答案 0 :(得分:1)
GCC文件说
-ansi 在C模式下,这相当于-std = c90。在C ++模式下,它相当于-std = c ++ 98。
所以,这是
g++ -ansi -std=c++0x ...
相当于
g++ -std=c++98 -std=c++0x ...
使用
编译时g++ -ansi -std=c++0x ...
我相信,由于命令行解析通常需要给定参数的 last 参数,因此它等同于根本不指定-ansi
。这是猜测。但我测试了一个简单的程序:
#include<iostream>
constexpr int value() {return 42;}
int main(void)
{
std::cout<<value()<<std::endl;
}
由于在C ++ 11中引入了constexpr
,因此无法在C ++ 98中编译该程序。但它与两者编译良好:
g++ -ansi -std=c++11 test.cpp
和
g++ -ansi -std=c++98 -std=c++11 t.cpp
但两者都失败了:
g++ -ansi -std=c++11 -ansi test.cpp
和
g++ -ansi -std=c++11 -std=c++98 t.cpp
给出错误:
error: ‘constexpr’ does not name a type
note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11
这表示无论指定什么 last -std
只有一个有效,您也可以删除-ansi
。
答案 1 :(得分:0)
如果你使用-std=c++0x
(从gcc 4.7开始变为-std=c++11
),使用-ansi
是多余的。另请参阅here
答案 2 :(得分:0)
这些选项是互斥的,因为它们都设置了编译器应该用于编译的语言的标准(或方言)。引用GCC docs:
-ansi
在C模式下,这相当于
-std=c90
。在C ++模式下,它等同于-std=c++98
。
所以你基本上是这样做的:
gcc -std=c++98 -std=c++0x ...
我相信后来的选项胜过GCC命令行中的早期选项,所以净效果是在C ++ 0x模式下编译。
答案 3 :(得分:0)
来自GCC: standards / C ++语言。
GCC实现了大部分C ++ 98(导出是一个值得注意的例外)和C ++ 03中的大多数更改。要在GCC中选择此标准,请使用以下选项之一-ansi,-std = c ++ 98或-std = c ++ 03;
如果我理解正确,-ansi
,-std=c++98
和-std=c++03
可以互换使用。具体而言,同时使用-ansi
和-std=c++11
是没有意义的。