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

Posted

技术标签:

【中文标题】如果我包含“-ansi”编译器选项,为啥我的 C++0x 代码无法编译?【英文标题】:Why does my C++0x code fail to compile if I include the "-ansi" compiler option?如果我包含“-ansi”编译器选项,为什么我的 C++0x 代码无法编译? 【发布时间】:2011-05-02 19:45:30 【问题描述】:

我遇到了一个非常奇怪的错误,只有在我使用 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 的编译工作。为什么?

【问题讨论】:

@Rob 实际上,只有第一个 (minimal.hpp) 是必需的。 【参考方案1】:

对于 GNU C++ 编译器,-ansi-std=c++98 的另一个名称,它会覆盖您之前在命令行中使用的 -std=c++0x。你可能只想要

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

-pedantic 在 C++ 中默认开启,因此无需重复。如果您想要更挑剔的警告,请尝试添加 -Wextra。)

【讨论】:

谢谢,我一直在使用相同的选项这么长时间,并没有想过 -ansi 到底做了什么,只是开始使用新标准的功能。 "-pedantic 在 C++ 中默认开启" 是吗? @LightnessRacesinOrbit 是的,文档在这一点上有点不清楚,但只要我记得,它就是这样。更准确地说,-pedantic-errors 是 C++ 中的默认值,-fpermissive 模式与 C 中的 -pedantic 大致相同;我不确定是否可以在 C++ 中禁用这些警告。 gcc.gnu.org/onlinedocs/gcc/Standards.html “要获得标准要求的所有诊断,您还应该指定 -pedantic(如果您希望它们是错误而不是警告,则应指定 -pedantic-errors)。” 对我来说似乎很清楚。我的经验是添加-pedantic 会产生更多警告。所以我必须不同意你的观点。 @LightnessRacesinOrbit 如果是这样,我很确定这是无意的,您应该提交错误报告。【参考方案2】:

std::shared_ptr 在 c++98 中不存在。尝试以下更改:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如果我包含“-ansi”编译器选项,为啥我的 C++0x 代码无法编译?的主要内容,如果未能解决你的问题,请参考以下文章

gcc编译选项总结

gcc编译选项总结

为啥 -ansi 和 -std=c++11 在 g++ 中会发生冲突?

为啥我的编译防护不能防止多个定义包含?

为啥我的 std::wofstream 写 ansi?

为啥我的 gcc 编译器不能识别 bzip2 函数,但允许我包含它们所属的库?