今天做项目时,直接拷贝了另一个工程里的头文件和源文件,然后运行时就出现这种问题,莫名其妙,在原程序里运行一点问题就没有,但是在新工程里就是error。
1 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(216): error C2065: “ColorMatrix”: 未声明的标识符 2 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(216): error C2146: 语法错误: 缺少“;”(在标识符“HotMat”的前面) 3 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(216): error C2065: “HotMat”: 未声明的标识符 4 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(216): error C2059: 语法错误:“{” 5 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(216): error C2143: 语法错误 : 缺少“;”(在“{”的前面) 6 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(220): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 7 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(222): error C2065: “ImageAttributes”: 未声明的标识符 8 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(222): error C2146: 语法错误: 缺少“;”(在标识符“ia”的前面) 9 1>e:c++utton_fly2utton_fly2gdipbutton.cpp(222): error C2065: “ia”: 未声明的标识符
同一台机器出现了这样的错误,真是让人费解,然后检查配置环境,结果是两个工程项目属性是一样的,然后检查头文件引用吧,只能一个一个看了,看来半天才发现原来是#include "stdafx.h"的问题,在这里面包含的有其他头文件,所以运行时老是报错。我的程序里添加的有几行代码如下:
#include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus;
原来是使用了gdi的头文件,这是windows的api,可以预编译,提高速度。
这里介绍一下stdafx.h是指编译器头文件预编译,所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
预编译文件的作用是把工程中的一部分代码提前编译好放在一个.pch文件中,以后在编译其他文件时,如果包含了这个头文件,编译器会首先读取这个.pch文件的内容,从而跳过该头文件的编译,节约了工程的编译时间,而*.pch文件一般是非常的大,因此在工程编译成功后,你可以考虑删除它。
编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。如下是stdafx中常包含的头文件,都是windows的一些核心组件
1 #include <afxwin.h> // MFC 核心组件和标准组件 2 #include <afxext.h> // MFC 扩展 3 4 #include <afxdisp.h> // MFC 自动化类 5 6 #ifndef _AFX_NO_OLE_SUPPORT 7 #include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持 8 #endif 9 #ifndef _AFX_NO_AFXCMN_SUPPORT 10 #include <afxcmn.h> // MFC 对 Windows 公共控件的支持 11 #endif // _AFX_NO_AFXCMN_SUPPORT 12 13 #include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持
这些组件在第一次编译后就不会在编译,而是直接引用。
总结起来一句话:
虽然说stdafx文件我们不常修改,但是如果你引用别人的头文件,就需要注意了,检查一下是否和其他地方耦合,而容易忽略的就是这个头文件,所以务必检查一下这个头文件是否有额外添加的代码。确保程序能运行起来。