在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系统意味着在我自己的文件夹structre中有一个“String.h”头文件是非常安全的。在XCode上,这似乎是一个重要的否定。
有没有办法控制XCode中的搜索路径行为更像是MSVC?或者我只需要避免将任何可能与系统头冲突的任何标头命名。编写跨平台代码并使用大量框架意味着偶然冲突的可能性似乎很大。
答案 0 :(得分:4)
你应该能够用gcc做同样的事情(我不知道xcode包装了多少东西并阻止访问某些功能)。控制搜索路径有很多选项(请参阅http://gcc.gnu.org/onlinedocs/gcc-4.5.0/cpp/Search-Path.html和http://gcc.gnu.org/onlinedocs/gcc-4.5.0/cpp/Invocation.html并查找-iquote
)。使用-v调用gcc将为您提供指定两者不同的路径。
答案 1 :(得分:0)
您可以尝试#include "./windows.h"
。编译器应该足够智能,首先在本地目录中解析。
答案 2 :(得分:0)
我不确定我是否理解你的问题
避免命名问题总是更好。 “&lt;&gt;”更依赖于编译器,而“”“(lol)更具有项目特定性。
例如,当使用您的编译器时会查看其编译器文件夹(系统),当使用“windows.h”时,它会查看您的项目文件夹
如果包含“windows.h”不起作用,请检查makefile或projectsettings
答案 3 :(得分:0)
请注意,除了-iquote
之外,gcc还支持-isystem
和-I
,以便您更好地控制搜索#includes的目录。