经常在Visual Studio中遇到各种编译,链接,或者运行时的错误,有时候项目不一样,所以,同样的问题,不一定有一个通用的处理方法。在这里我想记下我的错误,以便给自己一个提醒,也能给将来来网上找资料的朋友们提供一个解决方案。

  1.预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

  这个是预编译头的问题,预编译能提高编译速度,把某些不需要改动的代码预编译好之后,不再改动,下次编译只编译指定的部分,速度会快。编译产生的.pch文件是vs2010编译器产生的预编译头。 众所周知,stdafx.h经常作为vs2010默认的预编译头文件,stdafx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来看一个典型的由AppWizard生成的MFC程序的预编译头文件(默认stdafx.h),然后我们会发现这个头文件里包含了以下的头文件:

#include <afxwin.h> // MFC core and standard components 
#include <afxext.h> // MFC extensions 
#include <afxdisp.h> // MFC Automation classes 
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls 
#include <afxcmn.h>
  这些正是使用MFC的必须包含的头文件,这些文件是微软提供的稳定的库的头文件,我们只要调用就可以了。那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已,也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开project ->Setting->C/C++ 对话框,把Category指向Precompiled Header。在左边的树形视图里选择整个工程 Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 <工程名>.pch(我的示例工程名就是PCH)。 然后,在左边的树形视图里选择StdAfx.cpp.//这时只能选一个cpp文件! 这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件 。 
然后我们再选择一个其它的文件来看看,Precomplier 选择了 Use Precompiled Header 一项,头文件是我们指定创建PCH 文件的stdafx.h 文件。事实上,这里是使用工程里的设置,(如图1)/Yu”stdafx.h”,这样我们就设置好了预编译头文件,也就是说,我们可以使用预编译头功能了。
 
需要注意的是:
  1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的, 
你自己试以下就知道了,绝对有很惊人的效果?.. 
fatal error C1010: unexpected end of file while looking for precompiled 
header directive 
Generating Code...
  2)如果你把pch文件不小心丢了,编译的时候就会产生很多的不正常的行为。根据以上的分析,你只要让编译器生成一个pch文件,也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍,当然你可以傻傻的 Rebuild All,简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了,不然可是很浪费时间的哦。 
  2.