0

举个简单的例子:

struct Month
{
  int day;
};

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
  Month a;
  a.day = 5;
  return 0;
}

尝试在 VS2008、VS2010 或 VS2012 中编译它会导致 C2065(未声明的标识符错误)。为什么?

4

1 回答 1

3

Microsoft Visual C++ 不会#include "stdafx.h"在源文件中编译之前的任何内容;它假定源代码中直到并包括该行的所有代码都已编译。

预编译标题的维基百科页面说明了这一点,并在微软自己的页面上得到了证实:

编译器将.h文件之前出现的所有代码视为预编译。它跳到与文件#include关联的指令之外,使用文件中包含的代码,然后编译文件名之后的所有代码。.h.pch

幕后可能发生的事情是,预编译头文件 ( ) 的创建.pch涉及到此时的状态存储。然后,当您包含#include标头时,它只会按原样加载该状态(覆盖当前状态)以及在该行被有效丢弃之前已在源文件中编译的所有内容。

于 2013-04-24T02:31:25.687 回答