国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
學習VC MFC開發(fā)必須了解的常用宏和指令
userphoto

2010.07.22

關注

1、#include指令  
包含指定的文件  

2、#define指令   
預定義,通常用它來定義常量(包括無參量與帶參量),以及用來實現(xiàn)那些“表面似和善、背后一長串”的宏,它本身并不在編譯過程中進行,而是在這之前(預處理過程)就已經(jīng)完成了

3、#typedef指令
常用來定義一個標識符及關鍵字的別名它是語言編譯過程的一部分,但它并不實際分配內(nèi)存空間。

4、#ifndef   #else   #endif指令  
條件編譯。一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內(nèi)容只在滿足一定條件才進行編譯,也就是對一部分內(nèi)容指定編譯的條件,這就是“條件編譯”。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。  
條件編譯命令最常見的形式為:  
#ifdef 標識符  
   程序段1
#else
   程序段2  
#endif  
它的作用是:當標識符已經(jīng)被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。

5、#Pragma 指令  
在所有的預處理指令中,#Pragma 指令可能是最復雜的了,它的作用是設定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。其格式一般為  
#Pragma Para  
其中Para 為參數(shù),下面來看一些常用的參數(shù)。
l          message 參數(shù)。它能夠在編譯信息輸出窗口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。其使用方法為:  
#Pragma message(“消息文本”)  
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。  
當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏可以用下面的方法
#ifdef _X86
         #Pragma message(“_X86 macro activated!”)
         #endif   
當我們定義了_X86這個宏以后,應用程序在編譯時就會在編譯輸出窗口里顯示“_X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了  
l          另一個使用得比較多的pragma參數(shù)是code_seg。格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )  
它能夠設置程序中函數(shù)代碼存放的代碼段,當我們開發(fā)驅(qū)動程序的時候就會使用到它。  
l          #pragma once  
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經(jīng)有了,但是考慮到兼容性并沒有太多的使用它。  
l          #pragma hdrstop  
表示預編譯頭文件到此為止,后面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能占太多磁盤空間,所 以使用這個選項排除一些頭文件。有時單元之間有依賴關系,比如單元A依賴單元B,所以單元B要先于單元A編譯。你可以用#pragma startup指 定編譯優(yōu)先級,如果使用了#pragma package(smart_init) ,BCB就會根據(jù)優(yōu)先級的大小先后編譯。  
l          #pragma resource "*.dfm"  
表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。  
l          #pragma warning( disable : 4507 34; once : 4385; error : 164 )
等價于:  
#pragma warning(disable:4507 34) // 不顯示4507和34號警告信息
         #pragma warning(once:4385) // 4385號警告信息僅報告一次
         #pragma warning(error:164) // 把164號警告信息作為一個錯誤。
同時這個pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這里n代表一個警告等級(1---4)。
#pragma warning( push )保存所有警告信息的現(xiàn)有的警告狀態(tài)。
#pragma warning( push, n)保存所有警告信息的現(xiàn)有的警告狀態(tài),并且把全局警告
等級設定為n。
#pragma warning( pop )向棧中彈出最后一個警告信息,在入棧和出棧之間所作的
一切改動取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707)。
l          pragma comment(...)
該指令將一個注釋記錄放入一個對象文件或可執(zhí)行文件中。
常用的lib關鍵字,可以幫我們連入一個庫文件。
每個編譯程序可以用#pragma指令激活或終止該編譯程序支持的一些編譯功能。例如,對循環(huán)優(yōu)化功能:
#pragma loop_opt(on) // 激活
#pragma loop_opt(off) // 終止
有時,程序中會有些函數(shù)會使編譯器發(fā)出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,可以這樣:
#pragma warn —100 // Turn off the warning message for warning #100
int insert_record(REC *r)
{ /* function body */ }
#pragma warn +100 // Turn the warning message for warning #100 back on
函數(shù)會產(chǎn)生一條有唯一特征碼100的警告信息,如此可暫時終止該警告。
每個編譯器對#pragma的實現(xiàn)不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。

6、宏:__LINE__   和__FILE__
     定義源程序文件名和代碼行,這對于調(diào)試跟蹤代碼錯誤行很有幫助。
__TIME__           :編譯時間
__DATE__       :編譯日期
__TIMESTAMP__ :文件修改時間

7、調(diào)試宏:ASSERT()、VERIFY()、TRACE()
這三個宏在Debug環(huán)境下特別有效,常用于代碼的跟蹤調(diào)試。它們是否起作用取決于是否定義了預定義了宏 _DEBUG
l          ASSERT
ASSERT(booleanExpression)
說明:
計算變量的值。如果結(jié)構(gòu)的值為0,那么此宏便打印一個診斷消息并且程序運行失敗。如果條件為非0,那么什么也不做。診斷消息的形式為: assertion failed in file in line 其中name是元文件名,num是源文件中運行失敗的中斷號。 在Release 版中,ASSERT不計算表達式的值也就不中斷程序。如果必須計算此表達式的值且不管環(huán)境如何那么用VERIFY代替ASSERT。
這個宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)據(jù),如果出現(xiàn)了終止程序以免導致嚴重后果,同時也便于查找錯誤。
ASSERT_VAILD
ASSERT_VAILD(pObject)
說明:
用于檢測關于對象的內(nèi)部狀態(tài)的有效性。ASSERT_VALID調(diào)用此對象的AssertValid成員函數(shù)(把它們作為自己的變量來傳遞)。在 Release版中ASSERT_VALID什么也不做。在DEBUG版中,他檢查指針,以不同于NULL的方式進行檢查,并調(diào)用對象自己的 AssertValid成員函數(shù)。如果這些檢測中有任何一個失敗的話,那么他會以與ASSERT相同的方法顯示一個警告的消息。
l          VERIFY
VERIFY(booleanExpression)
說明:
在MFC的DEBUG版中,VERIFY宏計算它的變量值。如果結(jié)果為0,那么宏打印一個診斷消息并中止程序。如果條件不為0,那么什么工作也不作。診斷 有如下形式: assertion failed in file in line 其中name是源文件的名字,num是在源文件中失敗的中止行號。在 MFC的Release版中,VERIFY計算表達式值但不打印或中止程序。例如:如果表達式是個函數(shù)調(diào)用,那么調(diào)用成功。
l          TRACE
TRACE(exp)
說明:
把一個格式化字符串送到轉(zhuǎn)儲設備,例如,文件或調(diào)試監(jiān)視器,功能上和printf相似,可以說就是調(diào)試環(huán)境下printf的一個拷貝。TRACE宏是一個 在程序運行時跟蹤變量值的方便形式。在DEBUG環(huán)境中,TRACE宏輸出到afxDump。在Release版中他不做任何工作。另外還有一組可以帶參 數(shù)的相似的宏:TRACE0、TRACE1、TRACE2和TRACE3。提供格式如:
TRACE0(exp)
TRACE1(exp,param1)
TRACE2(exp,param1,param2)
TRACE3(exp,param1,param2,param3)
與TRACE相似,但它把跟蹤字符串放在代碼段中,而不是DGROUP,因此使用少的DGROUP空間。這些宏的用法和printf類似。

8、消息處理宏:DECLARE_MESSAGE_MAP 、BEGIN_MESSAGE_MAP、END_MESSAGE_MAP
DECLARE_MESSAGE_MAP()
說明:
用戶程序中的每個CCmdTarget派生類必須提供消息映射以處理消息。在類定義的末尾使用DECLARE_MESSAGE_MAP宏。接著,在定義類 成員函數(shù)的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,每個用戶消息處理函數(shù)的宏項下面的列表以及END_MESSAGE_MAP宏。
注釋:
如果在DECLARE_MESSAGE_MAP之后定義任何一個成員,那么必須為他們指定一個新存取類型(公共的,私有的,保護的)。
BEGIN_MESSAGE_MAP(the class,baseclass)
END_MESSAGE_MAP
說明:
使用BEGIN_MESSAGE_MAP開始用戶消息映射的定義。在定義用戶類函數(shù)的工具(.cpp)文件中,以BEGIN_MESSAGE_MAP宏開始消息映射,然后為每個消息處理函數(shù)增加宏項,接著以END_MESSAGE_MAP宏完成消息映射。

9、消息映射宏:ON_COMMAND 、ON_CONTROL、ON_MESSAGE、ON_VBXEVENT、ON_Update_COMMAND_UI和ON_REGISTERED_MESSAGE
ON_COMMAND(id,memberFxn)
說明:
此宏通過ClassWizard或手工插入一個消息映射。它表明那個函數(shù)將從一個命令用戶接口(例如一個菜單項或toolbar按鈕)處理一個命令消息。 當一個命令對象通過指定的ID接受到一個Windows WM_COMMAND消息時,ON_COMMAND將調(diào)用成員函數(shù)memberFxn處理此消 息。在用戶的消息映射中,對于每個菜單或加速器命令(必須被映射到一個消息處理函數(shù))應該確實有一個ON_COMMAND宏語句。
ON_CONTROL(wNotifyCode,id,memberFxn)
說明:
表明哪個函數(shù)將處理一個常規(guī)控制表示消息??刂茦俗R消息是那些從一個控制夫發(fā)送到母窗口的消息。
ON_MESSAGE(message,memberFxn)
說明:
指明哪個函數(shù)將處理一用戶定義消息。用戶定義消息通常定義在WM_USER到0x7FF范圍內(nèi)。用戶定義消息是那些不是標準 Windows WM_MESSAGE消息的任何消息。在用戶的消息映射中,每個必須被映射到一個消息處理函數(shù)。用戶定義消息應該有一個 ON_MESSAGE宏語句。
ON_Update_COMMAND_UI(id,memberFxn)
說明:
此宏通常通過ClassWizard被插入一個消息映射,以指明哪個函數(shù)將處理一個用戶接口個更改命令消息。在用戶的消息映射中,每個用戶接口更改命令(比訊被映射到一個消息處理函數(shù))應該有一個ON_Update_COMMAND_UI宏語句。
ON_VBXEVENT(wNotifyCode,memberFxn)
說明:
此宏通常通過ClassWizard被插入一個消息映射,以指明哪個函數(shù)將處理一個來自VBX控制的消息。在用戶的消息映射中每個被映射到一消息處理函數(shù)的VBX控制消息應該有一個宏語句。
ON_REGISTERED_MESSAGE(nmessageVarible,memberFxn)
說明:
Windows的RegisterWindowsMesage函數(shù)用于定義一個新窗口消息,此消息保證在整個系統(tǒng)中是唯一的。此宏表明哪個函數(shù)處理已注冊消息。變量nMessageViable應以NEAR修飾符來定義。

10、DEBUG_NEW
#define new DEBUG_NEW
說明:
幫助查找內(nèi)存錯誤。用戶在程序中使用DEBUG_NEW,用戶通常使用new運算符來從堆上分配。在Debug模式下(但定義了一個DEBUG符號), DEBUG_NEW為它分配的每個對象記錄文件名和行號。然后,在用戶使用CMemoryState::DumpAllObjectSince成員函數(shù) 時,每個以DEBUG_NEW分配的對象分配的地方顯示出文件名和行號。為了使用DEBUG_NEW,應在用戶的資源文件中插入以下指令: #define new DEBUG_NEW 一旦用戶插入本指令,預處理程序?qū)⒃谑褂胣ew的地方插入DEBUG_NEW,而MFC作其余的工作。但 用戶編譯自己的程序的一個發(fā)行版時,DEBUG_NEW便進行簡單的new操作,而且不產(chǎn)生文件名和行號消息。

11、異常宏:TRY、CATCH 、THROW、AND_CATCH、THROW_LAST和END_CATCH
TRY
說明:
使用此宏建立一TRY塊。一個TRY識別一個可排除異常的代碼塊。這些異常在隨后的CATCH和AND_CATCH塊處理。傳遞是允許的:異常可以傳遞一個外部TRY塊,或者忽略它們或者使用THROW_LAST宏。
CATCH(exception_class,exception_object_pointer_name)
說明:
使用此用定義一個代碼塊,此代碼用來獲取當前TRY塊中都一個異常類型。異常處理代碼可以訪問異常對象,如何合適的話,就會得到關于異常的特殊原因的更多 消息。調(diào)用THROW_LAST宏以把處理過程一下一個外部異??蚣埽绻鹐xception-class是類CExceptioon,那么會獲取所有異 常類型。用戶可以使用CObject::IsKindOf成員函數(shù)以確定那個特別異常被排除。一種獲取異常的最好方式是使用順序的AND_CATCH語 句,每個帶一個不同的異常類型。此異常類型的指針由宏定義,用戶不必定義。
注釋:
此CATCH塊被定義作一個C++范圍(由花括號描述)。如用戶在此范圍定義變量,那么它們只在吃范圍內(nèi)可以訪問。他還可以用于異常對象的指針名。
THROW(exception_object_pointer)
說明:
派出指定的異常。THROW中斷程序的運行,把控制傳遞給用戶程序中的相關的CATCH塊。如果用戶沒有提供CATCH塊,那么控制被傳遞到一個MFC模塊,他打印出一個錯誤并終止運行。
AND_CATCH(exception_class,exception _object_point_name)
說明:
定義一個代碼塊,它用于獲取廢除當前TRY塊中的附加異常類型。使用CATCH宏以獲得一個異常類型,然后使用AND_CATCH宏獲得隨后的異常處理代 碼可以訪問異常對象(若合適的話)已得到關于異常的特別原因的更多消息。在AND_CATCH塊中調(diào)用THROW_LAST宏以便把處理過程移到下個外部 異常框架。AND_CATCH可標記CATCH或AND_CATCH塊的末尾。
注釋:
AND_CATCH塊被定義成為一個C++作用域(由花括號來描述)。若用戶在此作用域定義變量,那么記住他們只在此作用域中可以訪問。他也用于exception_object_pointer_name變量。
THROW_LAST()
說明:
此宏允許用戶派出一個局部建立的異常。如果用戶試圖排除一個剛發(fā)現(xiàn)的異常,那么一般此異常將溢出并被刪除。使用THROW_LAST,此異常被直接傳送到下一個CATCH處理程序。
END_CATCH
說明:
標識最后的CATCH或AND_CATCH塊的末尾。

12、DECLARE_DYNAMIC 、IMPLEMENT_DYNAMIC
DECLARE_DYNAMIC(class_name)
說明:
但從CObject派生一個類時,此宏增加關于一個對象類的訪問運行時間功能。把DECLARE_DYNAMIC宏加入類的頭文件中,然后在全部需要訪問 此類對象的.CPP文件中都包含此模塊。如果像所描述那樣使用DELCARE_DYNAMIC和IMPLEMENT_DYNAMIC宏,那么用戶便可使用 RUNTIME_CLASS宏和CObject::IsKindOf函數(shù)以在運行時間決定對象類。如果DECLARE_DYNAMIC包含在類定義中,那 么IMPLEMETN_DYNAMIC必須包含在類工具中。  
IMPLEMENT_DYNAMIC(class_name,base_class_name)
說明:
通過運行時在串行結(jié)構(gòu)中為動態(tài)CObject派生類訪問類名和位置來產(chǎn)生必要的C++代碼。在.CPP文件中使用IMPLEMENT_DYNAMIC宏,接著一次鏈接結(jié)果對象代碼

13、DECLARE_DYNCreate、IMPLEMENT_DYNCreate
DECLARE_DYNCreate(class_name)
說明:
使用DECLARE_DYNCRETE宏以便允許CObject派生類的對象在運行時刻自動建立。使用此功能自動建立新對象,例如,但它在串行化過程中從 磁盤讀一個對象時,文件及視圖和框架窗應該支持動態(tài)建立,因為框架需要自動建立它。把DECLARE_DYNCreate宏加入類的.H文件中,然后在全 部需要訪問此類對象的.CPP文件中包含這一模式。如果DECLARE_DYNCreate包含在類定義中,那么IMPLEMENT_DYNCreate 必須包含在類工具中。
IMPLEMENT_DYNCreate(class_name,base_class_name)
說明:
通過DECLARE_DYNCreate宏來使用IMPLEMENT_DYNCreate宏,以允許CObject派生類對象在運行時自動建立。主機使用 此功能自動建立對象,例如,但它在串行化過程中從磁盤讀去一個對象時,他在類工具里加入IMPLEMENT_DYNCreate宏。若用戶使用 DECLARE_DYNCreate和IMPLEMENT_DYNCreate宏,那么接著使用RUNTIME_CLASS宏和CObject:: IsKindOf成員函數(shù)以在運行時確定對象類。若declare_dyncreate包含在定義中,那么IMPLEMENT_DYNCreate必須包 含在類工具中。

14、DECLARE_SERIAL、IMPLEMENT_SERIAL
DECLARE_SERIAL(class_name)
說明:
DECLARE_SERIAL為一個可以串行化的CObject派生類產(chǎn)生必要的C++標題代碼。串行化是把某個對象的內(nèi)容從一個文件讀出和寫入一文件。 在.H文件中使用DECLARE_SERIAL宏,接著在需要訪問此類對象的全部.CPP文件中包含此文件。如果DECLARE_SERIAL包含在類定 義中,那么IMPLEMENT_SERIAL必須包含在類工具中。DECLARE_SERIAL宏包含全部DECLARE_DYNAMIC, IMPLEMENT_DYCreate的功能。
IMPLEMENT_SERIAL(class_name,base_class_name,wSchema)
說明:
通過運行時在串行結(jié)構(gòu)中動態(tài)CObject派生類訪問類名和位置來建立必要的C++代碼。在.CPP文件中使用IMPLEMENT_SERIAL宏,然后一次鏈接結(jié)果對象代碼。

15、RUNTIME_CLASS
RUNTIME_CLASS(class_name)
說明:
使用此宏從c++類名中獲取運行時類結(jié)構(gòu)。RUNTIME_CLASS為由class_name指定的類返回一個指針到CRuntimeClass結(jié)構(gòu)。 只有以DECLARE_DYNAMIC、DECLARE_DYNCreate或DECLARE_SERIAL定義的CObject派生類才返回到一個 CRuntimeClass結(jié)構(gòu)的指針。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Visual C++ MFC 中常用宏的含義
CObject作用
DECLARE
DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
C語言實現(xiàn)try catch處理
C語言中的預處理詳解
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服