XCode中的#include - 尖括号和引号有什么区别?

4
在MSVC++中,根据文件是否包含在""或<>中,搜索#include文件的方式不同。引号形式首先在本地文件夹中搜索,然后在/I指定的位置搜索;尖括号形式避免了本地文件夹。
这意味着,在MSVC++中,可能会有与运行时和SDK标头相同名称的标头文件。
因此,例如,我需要包装Windows SDK的windows.h文件以取消一些导致麻烦的宏定义。使用MSVS时,只要使用引号形式包含它,我就可以将(可选的)windows.h文件添加到我的项目中:
// some .cpp file
#include "windows.h" // will include my local windows.h file

在我的windows.h中,我可以使用尖括号形式引入真正的头文件:

// my windows.h
#include <windows.h> // will load the real one
#undef ConflictingSymbol

在XCode中使用GCC尝试这个技巧并没有起作用。实际上,系统头文件中的尖括号#includes会在我的本地文件夹结构中找到名称类似的头文件。
MSVC系统意味着在自己的文件夹结构中有一个"String.h"头文件是非常安全的。但在XCode中,这似乎是一个主要的禁忌。
是否有一种控制XCode搜索路径行为更像MSVC的方法?还是我只需要避免命名任何可能与系统头文件冲突的头文件名称。编写跨平台代码并使用大量框架意味着意外冲突的可能性很大。

请注意,gcc支持`-quote - Paul R
4个回答

4

阅读该文档,似乎GCC与MSVC具有相同的<>与""含义,其中""表示搜索父文件目录,然后是搜索链,<>表示直接进入搜索链。 XCode必须传递一个设置以更改此行为。 - Chris Becke
我从未使用过MSVC,但有人告诉我存在差异:GCC首先搜索包含文件的目录,直接包含指令的文件所在的目录,而MSVC搜索直接或间接包含指令的所有文件的目录。我不知道如何在GCC中实现这一点。 - AProgrammer
顺便提一下,改变这种行为的参数是-I-(它有两个效果:删除在父文件目录中的搜索并将路径分成两部分)。 - AProgrammer

0
你可以尝试使用#include "./windows.h"。编译器应该足够聪明以首先在本地目录中解析它。

0
请注意,除了使用-I来指定将搜索哪些目录以进行#include处理外,gcc还支持-iquote-isystem,以便您更加控制这些目录。

-1

我不确定我是否正确理解了你的问题。

当然,避免命名问题总是更好的选择。 "<>" 更依赖于编译器,而 """" (哈哈) 更依赖于项目。

例如,当使用时,你的编译器将查找其编译器文件夹(系统),而当使用 "windows.h" 时,它将查找你的项目文件夹。

如果包含 "windows.h" 不起作用,请检查你的 makefile 或项目设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接