今天做項目時,直接拷貝了另一個工程里的頭文件和源文件,然后運行時就出現這種問題,莫名其妙,在原程序里運行一點問題就沒有,但是在新工程里就是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文件我們不常修改,但是如果你引用別人的頭文件,就需要注意了,檢查一下是否和其他地方耦合,而容易忽略的就是這個頭文件,所以務必檢查一下這個頭文件是否有額外添加的代碼。確保程序能運行起來。
