引用其他頭文件時出現這種錯誤,莫名其妙,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文件我們不常修改,但是如果你引用別人的頭文件,就需要注意了,檢查一下是否和其他地方耦合,而容易忽略的就是這個頭文件,所以務必檢查一下這個頭文件是否有額外添加的代碼。確保程序能運行起來。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM