74

我想在 Mac Terminal 中编译 C++11 源代码但失败了。我试过了,g++ -std=c++11但没有任何效果。终端始终读取. 但是,类似的事情运行良好(当然 C++11 源代码无法通过)。g++ -std=c++0xg++ -std=gnu++11g++ -std=gnu++0xunrecognized command line optiong++ -std=gnu

我应该使用哪个选项来打开 C++11 支持?

顺便说一句,我使用的命令行工具安装在 Xcode 中,我很确定它们是最新的。

4

2 回答 2

108

正如其他人指出的那样,您应该使用clang++而不是g++. 此外,您应该使用 libc++ 库而不是默认的 libstdc++;包含的 libstdc++ 版本相当旧,因此不包含 C++11 库功能。

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

如果您尚未安装 Xcode 的命令行工具,则可以使用该xcrun工具运行编译器和其他工具,而无需执行此操作。

xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

此外,如果您想要禁用特定警告,您可以将其他标志传递给编译器以执行此操作。在警告消息的末尾,它会向您显示可以启用警告的最具体的标志。要禁用该警告,请no-在警告名称前添加。

例如,您可能不想要 c++98 兼容性警告。在这些警告结束时,它会显示标志-Wc++98-compat并禁用它们你 pass -Wno-c++98-compat

于 2013-01-09T05:52:39.457 回答
27

XCode在编译时使用clangand ,而不是(假设您没有自定义东西)。相反,请尝试:clang++g++

$ cat t.cpp
#include <iostream>

int main()
{
    int* p = nullptr;
    std::cout << p << std::endl;
}
$ clang++ -std=c++11 -stdlib=libc++ t.cpp
$ ./a.out 
0x0

感谢 bames53 的回答指出我遗漏了-stdlib=libc++

如果你想使用一些 GNU 扩展(也使用 C++11),你可以使用-std=gnu++11而不是-std=c++11,这将打开 C++11 模式并保持 GNU 扩展启用。

于 2013-01-09T05:47:28.693 回答