如何正确使用stdafx.h?

如何正确使用stdafx.h?

问题描述:

什么是使用stdafx.h适当方式,在分离的依赖方面?如何正确使用stdafx.h?

如果我把一切在那里,然后我编译的速度极快,而我需要的任何文件说的是

#include "stdafx.h" 

与告诫说:

  1. 我没有知道哪些文件取决于哪些头文件。
  2. 它降低了模块性,使我的代码更少重复使用。
  3. 我不能再将C #include从C++中分离出来(例如,cstringstring.h),而没有很大的痛苦。 (说到这,这是否即使有关系吗?)

如果我把什么在那里,我能很好地组织一切 - 但后来我编译大幅放缓。

如果我把一切包括在我的个人文件的时间间隔头,然后我得到两全其美的,与现在我要跟踪的同步问题的警告。

这个问题是否有一个众所周知的/广为接受的解决方案?

你不应该把自己的头文件中stdafx.h,因为你的代码可能会改变,并会导致您的整个程序重新编译。

我通常把标准的头文件和库等在那里,如所有boost包括。

+0

同意。把事情放在预编译的头文件中,你不会在该项目的范围内触及。 –

+0

我不知道这是如何相关。我*仍*不知道哪些源文件取决于哪些头文件(我是否真的需要在每个文件中间接地包含#include ?),即使它们是系统头文件。所以它会*仍然是非模块化的。 – Mehrdad

+3

@Mehrdad,这是具有预编译头文件的妥协之一。 – Marlon

当使用预编译的头,你要确保你的项目完全编译即使没有PCH存在(所以把它作为优化,不包括在每一个TU更换)。除此之外,不要把所有东西放在那里(更重要的是,千万不要把你自己项目的头文件--PCH应该只包含那些不会改变或很少改变的东西 - 系统库,外部依赖项),而是试图保持预编译最常用/最大的东西。

就个人而言,我宁愿有比没有想法(知名度)的编译速度较慢的依赖是如何。然而,一切都是有限的。

由于每个项目都有自己的预编译的头文件,所以我只是把常见到所有包含在里面。假如一个项目使用了一些增强头文件,那么这些头文件就可以很好地适用于整个项目,并且不会改变它们。因此,在系统或第三方等预编译头文件中很少/永远不会更改头文件。

对于编译速度,我宁愿尽可能地依赖前向声明,分成更小的库,并尝试查看是否可以以易失代码不影响其他重编译的方式组织事物码。

Yor编译器可能有一个“show includes”标志。打开它并查找重复的深层嵌套层次结构。考虑在每个这样的深层树中包含一个最浅的include文件。

有条件包括PCH的,然后定义类似“的#define _PRE_COMPILE_” 这样,原来的标题是仍然可见,该代码是模块化的,如果你因此需要。这方面的一个例子是包括

#ifdef _PRE_COMPILE_ 
#include "stdafx.h" 
#elif 
#include <iostream> 
#include <cstring> 
#endif 

包括这在每个源文件的开始。

+0

的PCH。由于Microsoft的PCH实现工作方式,在'#include“stdafx.h”'之前有一个'#ifdef'不起作用。 –