C++项目中头文件的首选策略是什么:<test.h>
或"test.h"
? 在我的经验,我用:C++头文件样式
#include <test_lib.h>
包括C/C++头文件,第三方零件库,其路径在项目设置中指定(增强等)。#include "my_test.h"
- 它用于项目中存在的头文件。
任何其他做法可以在这里适用?
可以包含带有相对路径的头文件:像#include "../new_test.h"
?或者移动相对路径到项目设置会更好吗?
C++项目中头文件的首选策略是什么:<test.h>
或"test.h"
? 在我的经验,我用:C++头文件样式
#include <test_lib.h>
包括C/C++头文件,第三方零件库,其路径在项目设置中指定(增强等)。#include "my_test.h"
- 它用于项目中存在的头文件。任何其他做法可以在这里适用?
可以包含带有相对路径的头文件:像#include "../new_test.h"
?或者移动相对路径到项目设置会更好吗?
尖括号用于包含系统标题。理论上来说,IIRC,他们甚至不一定是文件。在实践中,<>
表示做而不是搜索当前目录,只有包含路径,而""
表示查看当前目录,然后搜索包含路径。
至于相对路径,它可能取决于你的环境,我会建议路径相对于你的项目包含路径(由-I
指定)。
This MSDN文章解释了预处理程序如何根据#include
语法形式搜索标题。您的风格非常好,因为Visual C++,Windows Framework,Boost和其他框架/包的标头(通常)都位于项目目录之外。
关于你的第二个问题,我的建议是避免相对路径。如果你围绕这个标题移动,你需要通过改变你的代码来调整相对路径,这是一个坏主意。我宁愿将它放在尖括号内并添加到/I
选项的路径。例如。要在项目中包含C:\frameworks\frameworkA\include\a.h
,您可以使用#include <a.h>
和\I "C:\frameworks\frameworkA\include"
,如果你的框架根路径添加到/I
,然后把局部路径尖括号内的头它也许是更多的描述。例如。 #include <frameworkA\include\a.h>
和/I "C:\frameworks"
。现在在代码中明确表示a.h
属于frameworkA
。
仅为项目目录中的标题使用相对路径(例如,如果将代码组织到位于项目子目录中且不打算移动的模块中)。
+1为描述性的包含位,当项目依赖于多个库时真的有用! –
关于MSDN主题,你可以澄清一下这句话:“在任何以前打开的包含文件的目录中,它们是以相反的顺序打开的。搜索从最后打开的包含文件的目录开始,并继续通过目录首先打开的包含文件。“ –
说实话,我从来没有依赖这条规则,但我猜想VC编译器通过将它们放到堆栈上“记住”所有先前解决的路径。如果在步骤1中找不到标题,则预处理器将从栈顶开始,使用这些记忆的路径,这是最近路径。恕我直言,这个规则(2)引入了一些混淆,因为它允许所有具有先前解析路径的头文件可以包含在引用语法中。例如'bh'和'ch'在'C:\ foo'中,并且您有# include“ah”#include
您可以使用。在编译时可以使用-I <directory containing test.h>
选项使用<test.h>
。一般来说,这是我遵循的做法,我倾向于对所有头文件使用<test.h>
,而不管它们是第三方头文件还是我写的头文件。
这可能是一个好主意,不要使用相对路径"../test.h"
。从个人经验来看,这种编写#include
声明的方式迫使你强化你的目录结构。如果您决定明天将test.h
移动到不同的目录中,则必须进入每个头文件并将test.h
的相对路径更改为新路径 - 这是一个耗时的练习。最好把它转移到makefile(通过-I
),然后从那里处理它。
编译器cl,gcc之间有区别吗? –
我不会赌我的欧元,但正如我所说,实际上大多数实现都遵循上述相同的过程。 –