VC建的Project会让人选择预编译选项。 所谓头文件预编译,就是把一个Project中使用的一些头文件(如Windows.H、Afxwin.H, 等其他头文件) 放在“stdafx.h” 中, “stdafx.cpp”只包含这个头文件, 并且预编译stdafx.cpp生成 预先编译头文件,编译结果是得到 “projectname.pch”文件 和一个.obj文件。以后编译该工程时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。 这一点对一些大的Project尤其有效。
当然 stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx.h"指令,使用projectname.pch编译这条指令之后的所有代码。
预编译涉及到的编译开关:
/Yu(使用预编译头文件)
/Fp(命名 .pch 文件)
/Yc(创建预编译头文件)
/FI(命名强制包含文件) 放在第一行。
例子:
cl /Ycstdafx.h stdafx.cpp [/FpOtherName.pch] (预编译一次)
cl /Yustdafx.h [/FpOtherName.pch] test.cpp stdafx.obj [/FIstdafx.h 如果不想每个cpp文件都包含这个头文件 可以用这个。]( 以后只要执行这个就可以编译整个Project)
Comment:
//test.cpp
#ifdef DEF_HEAD
#include "stdafx.h"
#endif
void main()
{
// Do something.
}
用下面的命令会得到一个编译错误。 因为编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令, 也就是说整个cpp文件 的#ifdef会被忽略掉, 但#endif依然存在。所以产生错误。 因此,所有的cpp实现文件第一条语句都是:#include "stdafx.h"。
cl /Yustdafx.h /DDEF_HEAD test.cpp stdafx.obj
预编译涉及到的编译开关:
/Yu(使用预编译头文件)
/Fp(命名 .pch 文件)
/Yc(创建预编译头文件)
/FI(命名强制包含文件) 放在第一行。
例子:
cl /Ycstdafx.h stdafx.cpp [/FpOtherName.pch] (预编译一次)
cl /Yustdafx.h [/FpOtherName.pch] test.cpp stdafx.obj [/FIstdafx.h 如果不想每个cpp文件都包含这个头文件 可以用这个。]( 以后只要执行这个就可以编译整个Project)
Comment:
//test.cpp
#ifdef DEF_HEAD
#include "stdafx.h"
#endif
void main()
{
// Do something.
}
用下面的命令会得到一个编译错误。 因为编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令, 也就是说整个cpp文件 的#ifdef会被忽略掉, 但#endif依然存在。所以产生错误。 因此,所有的cpp实现文件第一条语句都是:#include "stdafx.h"。
cl /Yustdafx.h /DDEF_HEAD test.cpp stdafx.obj