举个简单的例子:
struct Month
{
int day;
};
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
Month a;
a.day = 5;
return 0;
}
尝试在 VS2008、VS2010 或 VS2012 中编译它会导致 C2065(未声明的标识符错误)。为什么?
举个简单的例子:
struct Month
{
int day;
};
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
Month a;
a.day = 5;
return 0;
}
尝试在 VS2008、VS2010 或 VS2012 中编译它会导致 C2065(未声明的标识符错误)。为什么?
Microsoft Visual C++ 不会#include "stdafx.h"
在源文件中编译之前的任何内容;它假定源代码中直到并包括该行的所有代码都已编译。
预编译标题的维基百科页面说明了这一点,并在微软自己的页面上得到了证实:
编译器将
.h
文件之前出现的所有代码视为预编译。它跳到与文件#include
关联的指令之外,使用文件中包含的代码,然后编译文件名之后的所有代码。.h
.pch
幕后可能发生的事情是,预编译头文件 ( ) 的创建.pch
涉及到此时的状态存储。然后,当您包含#include
标头时,它只会按原样加载该状态(覆盖当前状态)以及在该行被有效丢弃之前已在源文件中编译的所有内容。