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