引用其他头文件时出现这种错误,莫名其妙,error C2065: “ColorMatrix”: 未声明的标识符

今天做项目时,直接拷贝了另一个工程里的头文件和源文件,然后运行时就出现这种问题,莫名其妙,在原程序里运行一点问题就没有,但是在新工程里就是error。

1 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(216): error C2065: “ColorMatrix”: 未声明的标识符
2 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(216): error C2146: 语法错误: 缺少“;”(在标识符“HotMat”的前面)
3 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(216): error C2065: “HotMat”: 未声明的标识符
4 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(216): error C2059: 语法错误:“{”
5 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(216): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
6 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(220): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
7 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(222): error C2065: “ImageAttributes”: 未声明的标识符
8 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(222): error C2146: 语法错误: 缺少“;”(在标识符“ia”的前面)
9 1>e:\c++\button_fly2\button_fly2\gdipbutton.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文件我们不常修改,但是如果你引用别人的头文件,就需要注意了,检查一下是否和其他地方耦合,而容易忽略的就是这个头文件,所以务必检查一下这个头文件是否有额外添加的代码。确保程序能运行起来。

 

posted @ 2013-09-12 11:08  struggle_time  阅读(5327)  评论(1编辑  收藏  举报