Apple 的 clang 似乎神奇地包含了与我的代码冲突的 Xcode 头文件。例如,它们定义了 stoi()
而标准 C++ header 没有。 Clang 不会在其他平台上执行此操作,例如FreeBSD。
Mac OS 上的错误示例:
$ 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* ...
^
此编译在 FreeBSD 上运行良好。
问题是因为除了/usr/include/c++ 中的标准 C++ header 之外,Apple clang 还包括 Xcode 应用程序工具链中的 header 。有没有什么方法可以在不使用 -nobuiltininc
标志的情况下关闭它?
最佳答案
OSX 上较新版本的 clang 的默认 C++ 库是 libc++
,它是 C++11 标准的相当完整的实现。 header 都是 C++11,并且没有条件部分来删除只应在该标准中可用的方法(例如,尝试使用 --std=c++03
进行编译不会达到预期的效果。
Apple 环境中存在的 stdlib++
版本没有这个问题,因为 (1) 它不是 C++11 标准的完整实现,并且 (2) 您实际上可以为旧的 c++ 标准编译。
因此,如果您使用 --stdlib=libstdc++
进行编译,您将针对 GNU 标准库头文件和库进行编译,而 std 的定义没有问题::stoi
(如果我正确解释问题,还有其他例程)。
但请记住,您必须使用此标志编译项目的每个 c++ 元素,否则您最终会得到使用不同标准库编译的代码,它们不会链接在一起。
不过,真正的问题是,如果您开始使用 C++11 功能并开始使用 --std=c++11
显式编译,那么您可能会遇到此问题gcc 在未来的某个时候也会出现问题。较新版本的编译器支持更多的 C++11 标准,因此会在 header 中定义此例程,然后回到原点。
关于c++ - 阻止 Apple clang 将 Xcode 路径添加到标准包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314053/