我正在尝试使用 Xcode 6.1.1 构建一个为 Windows、OSX 下的 Visual Studio 完成的项目。
我遇到了一个问题,文件中需要包含 #include <string.h>
。但是,在执行此操作的文件所在的同一文件夹中还有一个名为 string.h
的文件。 .
在我的 Visual Studio 项目下,这仍然解析文件,首先搜索系统路径。
在 Xcode 项目中,我确保在“用户 header 搜索路径”下设置自己的路径 - Xcode 扩展到正确的路径。我还将“始终搜索用户路径”设置为“否” - 根据文档,应首先搜索系统路径: https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW110
但是#include <string.h>
似乎被视为 #include "string.h"
由于某种原因。
配置是在项目中定义的,我已确保目标不会覆盖它。
这是系统包含 <>
的 Xcode/OSX 东西吗?先搜索包含文件的路径?
我本地string.h
文件位于ruby/api/string.h
相对于我的用户 header 搜索路径中的包含路径。
https://gist.github.com/thomthom/034b539bede38dd68261
的结果:
https://gist.github.com/thomthom/034b539bede38dd68261
最佳答案
为满足#include
指令而搜索的路径以及搜索它们的顺序是实现定义的。这包括是否在任何默认路径之前、之后搜索任何用户指定的包含路径(如果甚至支持)。
两种形式的#include
指令都是这种情况。特别是,尽管实现执行某种相对搜索来查找使用双引号包含语法指定的文件是很常见的,但 C 并不要求这样做。它仅要求,如果用于解析双引号包含的实现定义的机制失败,则编译器必须依靠用于解析尖括号包含的实现定义的方法。
此外,C 仅指定给定 header 名称唯一标识要包含的文件的情况的行为。根据人们如何解释“唯一”,人们可能会声称 C 在您描述的情况下根本没有定义任何行为,因为您没有唯一地标识要包含的 header 。不过,这有点疯狂——我认为最好根据实现定义的定位 header 的方法来解释“唯一”。
最好的办法是避免 header 名称与标准 header 名称冲突。其中一种版本是将它们放在一个子目录中,该子目录将以其名称作为前缀。例如,将 string.h
放入 src/myapp/
中,并将其包含为
#include "myapp/string.h"
为了尽可能安全,请确保目录 src/
位于包含搜索路径中。
关于c++ - 为什么 Xcode 6 在系统路径之前错误地包含用户路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28843173/