兼容g ++同时使用-ansi和-std = c ++ 0x标志

时间:2014-10-15 07:19:33

标签: gcc c++11 g++ c++98

我发现在我们的一个项目中,我们使用如下的编译命令:

g++ -ansi -std=c++0x ...

同时使用标记-ansi-std=c++0x吗?

是否正确?

我为gcc读过man,看起来我们只能选择一个标志。你觉得怎么样?

4 个答案:

答案 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是没有意义的。