(一)剛接觸到MFC編程的人往往會被MFC 向導生成的各種宏定義和預處理指令所嚇倒,但是預處理和宏定義又是C語言的一個強大工具。使用它們可以進行簡單的源代碼控制,版本控制,預警或者完成一些特殊的功能。但常用的并不多!
在VC.Net 普遍使用的預處理指令:
#pragma once //只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次
//傳統(tǒng)的解決辦法是使用#ifdef 以及#endif 來避免頭文件的重復編譯
## 連接符與# 符
## 連接符號由兩個井號組成,其功能是在帶參數(shù)的宏定義中將兩個子串(token)聯(lián)接起來,從而形成一個新的子串。但它不可以是第一個或者最后一個子串。所謂的子串(token)就是指編譯器能夠識別的最小語法單元。具體的定義在編譯原理里有詳盡的解釋,但不知道也無所謂。同時值得注意的是#符是把傳遞過來的參數(shù)當成字符串進行替代。 (二)預編譯指令的用法 預處理指令是以#號開頭的代碼行.。
下面是部分預處理指令:
指令 用途 # 空指令,無任何效果
#include 包含一個源代碼文件
#define 定義宏
#undef 取消已定義的宏
#if 如果給定條件為真,則編譯下面代碼
#ifdef 如果宏已經定義,則編譯下面代碼
#ifndef 如果宏沒有定義,則編譯下面代碼
#elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼
#endif 結束一個#if……#else條件編譯塊
#error 停止編譯并顯示錯誤信息
一、文件包含 #include預處理指令的作用是在指令處展開被包含的文件。
二、宏 宏定義了一個代表特定內容的標識符。預處理過程會把源代碼中出現(xiàn)的宏標識符替換成宏定義時的值。
1).宏最常見的用法是定義代表某個值的全局符號。
2).宏的第二種用法是定義帶參數(shù)的宏,這樣的宏可以象函數(shù)一樣被調用,但它是在調用語句處展開宏,并用調用時的實際參數(shù)來代替定義中的形式參數(shù)。
1.#define指令
#define預處理指令是用來定義宏的。
該指令最簡單的格式是:首先神明一個標識符,然后給出這個標識符代表的代碼。在后面的源代碼中,就用這些代碼來替代該標識符。這種宏把程序中要用到的一些全局值提取出來,賦給一些記憶標識符。
宏表示的值可以是一個常量表達式,其中允許包括前面已經定義的宏標識符。
宏還可以代表一個字符串常量,例如:
#define VERSION 'Version 1.0 Copyright(c) 2003'
2.帶參數(shù)的#define指令
帶參數(shù)的宏和函數(shù)調用看起來有些相似。
3.#運算符
出現(xiàn)在宏定義中的#運算符把跟在其后的參數(shù)轉換成一個字符串。有時把這種用法的#稱為字符串化運算符。 4.##運算符
##運算符用于把參數(shù)連接到一起。預處理程序把出現(xiàn)在##兩側的參數(shù)合并成一個符號。 三、條件編譯指令 條件編譯指令將決定那些代碼被編譯,而哪些是不被編譯的??梢愿鶕?jù)表達式的值或者某個特定的宏是否被定義來確定編譯條件。
1.#if指令
#if指令檢測跟在制造另關鍵字后的常量表達式。如果表達式為真,則編譯后面的代碼,知道出現(xiàn)#else、#elif或#endif為止;否則就不編譯。
2.#endif指令
#endif用于終止#if預處理指令。
3.#ifdef和#ifndef 4.#else指令
#else指令用于某個#if指令之后,當前面的#if指令的條件不為真時,就編譯#else后面的代碼。
5.#elif指令 #elif預處理指令綜合了#else和#if指令的作用。
6.其他一些標準指令 #error指令將使編譯器顯示一條錯誤信息,然后停止編譯。
#line指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。
#pragma指令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息。
(三)#Pragma宏
(四)C語言頭文件聲明
在我們查看別人的源程序的時候,經常會看到別人的源碼頭文件中有一些比較奇怪的代碼,這些代碼使用來干什么的呢?比如下面這個例子:
(五)VC注釋宏的作用 “注釋宏”是類似這樣的宏:
//}}AFX_MSG_MAP
VC注釋宏是給類向導用的,若要使用類向導添加成員變量和成員函數(shù),則要保留注釋宏;否則,必須手動添加。
是用于vc編輯器自動生成代碼定位用的如果你把它刪了相應的classwizad就不能自動生成代碼了 。
你添加消息響應的時候是不是發(fā)現(xiàn)源代碼里多了些代碼?那些代碼為什么會在那里出現(xiàn)為什么不在別的文件里出現(xiàn)就是因為那里有注釋宏它要將代碼生成在相應注釋宏之間 。
這個注釋是讓ClassWizard能夠分辨出哪些代碼是它生成的,哪些是你自己寫的。你自己寫的代碼要在這個注釋之外,這樣ClassWizard再修改消息映射的時候就不會管你的代碼了。
限于以前的硬件速度,ClassWizard比較傻冒,所以需要這些注釋宏來定位。從7.0(Visua Studio 2003)l開始,就不再需要了。新的屬性頁能夠自動分析你的代碼,為你添加或者刪除代碼,而無需什么特殊標記的幫忙。因此注釋宏已經是歷史產物了。
|
|