c++ - 为什么 Xcode 6 在系统路径之前错误地包含用户路径?

标签 c++ c xcode6 include-path

我正在尝试使用 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 东西吗?先搜索包含文件的路径?

Search path config

我本地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/

相关文章:

ios - 在 Objective-C 中的 Swift 类上调用 NSStringFromClass 返回模块错位名称

c++ - 指向对象数组的指针的初始化

c++ - 堆栈和堆地址区域在 Windows 和 Linux 中是不同的

使用自动布局快速增长 UITextView

C编程: Calling a function with macros

无法打开设备 eth0 : eth0: socket: Invalid argument

ios - 如何在 Swift 中获取自定义单元格中值组件的索引路径?

c++ - 如何使用 libpq 插入此自定义数据类型?

c++: X 类没有名为 Y 的成员

c - GDB 打印 char 数组中的所有值