问题 如果我包含“-ansi”编译器选项,为什么我的C ++ 0x代码无法编译?


我遇到了一个非常奇怪的错误,如果我使用的话只会弹出 ansi 旗。

#include <memory>

class Test
{
  public:
    explicit Test(std::shared_ptr<double> ptr) {}
};

这是使用gcc 4.5.2和4.6.0(20101127)测试的编译:

g++ -std=c++0x -Wall -pedantic -ansi test.cpp
test.cpp:6:34: error: expected ')' before '<' token

但没有编译 -ansi 作品。为什么?


7574
2018-05-02 19:45


起源

实际上@Rob只需要第一个(minimal.hpp)。 - Neil Butterworth


答案:


对于GNU C ++编译器, -ansi 是另一个名字 -std=c++98,这超越了 -std=c++0x 你以前在命令行上。你可能只想要

$ g++ -std=c++0x -Wall minimal.cpp

-pedantic 对于C ++,默认情况下是打开的,所以不必再说一遍。如果您想要挑选警告,请尝试添加 -Wextra。)


10
2018-05-02 19:54



谢谢,我已经使用了相同的选项这么长时间,并没有想到究竟是什么 -ansi 做了,刚刚开始使用新标准的功能。 - anon
“-pedantic 默认情况下为C ++打开“ 是吗? - Lightness Races in Orbit
@LightnessRacesinOrbit是的,文档在这一点上有点不清楚,但只要我记得就一直这样。这样说会更准确 -pedantic-errors 是C ++中的默认值,和 -fpermissive 模式大致相同 -pedantic 为C;我不确定它是否均匀 可能 在C ++中禁用这些警告。 - zwol
gcc.gnu.org/onlinedocs/gcc/Standards.html  “要获得标准所需的所有诊断,您还应该指定-pedantic(或者 - 如果您希望它们是错误而不是警告,则为-pedantic-errors)。” 对我来说似乎很清楚。我的经验是添加 -pedantic 产生更多警告。所以我必须不同意你的意见。 - Lightness Races in Orbit
@LightnessRacesinOrbit如果是这样,我很确定这是无意的,你应该提交一份错误报告。 - zwol


std::shared_ptr 在c ++ 98中不存在。尝试这些更改:

#include <tr1/memory>
...
explicit Test(std::tr1::shared_ptr<double> ptr) {}   

3
2018-05-02 19:51





嗯,因为C ++ 0x还没有ANSI标准? ANSI标志检查是否符合现有标准,而不是未来标准。


0
2018-05-02 19:52