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


    今天做项目时,直接拷贝了另一个工程里的头文件和源文件,然后运行时就出现这种问题,莫名其妙,在原程序里运行一点问题就没有,但是在新工程里就是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文件我们不常修改,但是如果你引用别人的头文件,就需要注意了,检查一下是否和其他地方耦合,而容易忽略的就是这个头文件,所以务必检查一下这个头文件是否有额外添加的代码。确保程序能运行起来。

  • 相关阅读:
    salt执行报错一例
    state配置语言实战
    salt-ssh使用
    八、job管理
    六、saltstack的module组件
    五、Pillar数据管理中心
    Web Server与App Server
    二分查找的时间复杂度(TODO )
    二分查找的时间复杂度(TODO )
    git : error setting certificate verify locations
  • 原文地址:https://www.cnblogs.com/songliquan/p/3316464.html
Copyright © 2020-2023  润新知