我发现文章Where does Visual Studio look for C++ header files?是一个好的开始,但我还有其他问题 . VS查找包含文件的一般顺序是(1)本地目录,(2)用/ I指定的那些,以及(3)由环境指定的那些(INCLUDE env var或VC设置) .
Q1 . 我认为/ X选项关闭(3) . 对?或者它也关闭(1)?
Q2 . 如果我有一个嵌套的包含文件(main.c包含inc1.h,其中包括inc2.h),其中第一个包含的文件位于其中一个/ I文件夹中,VS是否会查找从该文件开始的第二个包含文件/ I文件夹,或只是原始源文件的本地文件夹? VS2008似乎是以第一种方式运行,但我想在某处找到它 .
2 回答
/X
选项不会禁用在本地目录中查找文件(假设您包含它们,如"this.h"
而不是<this.h>
) . 您可以通过创建文件轻松测试创建一个空
foo.h
,并使用/X
标志进行编译 .对于Q2,我使用VC2010进行的测试显示它与VC2008的行为相同 . 我做的是有一个主要的:
使用包含inc1.h的文件夹inc
有两个不同的
inc2.h
文件;在inc
中,在我的源文件目录中有一个 . 我的源目录中的那个是空的,inc
中的那个有一个#error
指令 . 一般来说,你不想依赖于此 . C和C标准都只是在#include
上说"the named source file is searched for in an implementation-defined manner" .Q1 .
/X
选项确实关闭了INCLUDE
var,但没有关闭本地目录(参见Q2)Q2 . 对于嵌套的包含文件,C和C编译器使包含文件的位置成为当前本地目录,因此您无法将其关闭 .
例如 . 如果在其中一个
/I
文件夹中找到了inc.h
文件,它会尝试包含如下文件:#include "foo/foo.h"
然后它必须首先使用自己的本地目录,在所有其他/I
文件夹之前,因为它们都可能有foo
文件夹和foo.h
文件,并且您的inc.h
文件可能无法编译,因为它刚刚包含错误的头文件 .我刚刚为VS2008找到了这个msdn page,似乎有一个完整的解释 .