Apple的铿锵似乎神奇地包含了与我的代码冲突的Xcode头文件。例如,它们定义stoi()
,而标准C ++标头则不定义$ clang -I. -I../../../include -c compile.cpp
compile.cpp:949:18: error: call to 'stoi' is ambiguous
arg.iValue = stoi(current.token);
^~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/string:4019:37: note:
candidate function
_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* ...
^
。 Clang不会在其他平台上执行此操作,例如FreeBSD的。
Mac OS上的错误示例:
-nobuiltininc
这个编译在FreeBSD上运行正常。
问题是因为除了/ usr / include / c ++中的标准C ++头文件之外,Apple clang还包含Xcode应用程序工具链中的头文件。有没有办法在不使用{{1}}标志的情况下关闭它?
答案 0 :(得分:1)
OSX上更新版本的clang的默认C ++库是libc++
,它是C ++ 11标准的完全实现。标题都是C ++ 11,并且没有条件部分来删除只应该在该标准中可用的方法(例如,尝试使用--std=c++03
进行编译并不具有所需的效果。
苹果环境中出现的stdlib++
版本没有这个问题,因为(1)它不是C ++ 11标准的完整实现, (2)你可以实际编译旧的c ++标准。
因此,如果使用--stdlib=libstdc++
进行编译,那么您正在编译GNU标准库头文件库,这些文件库和库不会出现std::stoi
(以及其他例程)定义的问题如果我正确地解释了这个问题。)
但请记住,您必须使用此标志编译项目的每个 c ++元素,否则您最终会得到使用不同标准库编译的代码,但它们不会联系在一起。
但真正的问题是,如果您开始使用C ++ 11功能并开始使用--std=c++11
进行明确编译,那么您可能会在未来某个时候遇到此问题gcc也是如此。较新版本的编译器支持更多的C ++ 11标准,因此将在标题中定义此例程,然后重新回到原点。