日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

宏定義VC

 喜歡站在山上 2022-03-16
(一)剛接觸到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è)例子:

  • 宏定義 __C_LOG_H__
      上述代碼中的#ifndef __C_LOG_H__ 用來(lái)判斷是否我們已經(jīng)定義呢宏__C_LOG_H__, 如果沒有定義則我們定義宏__C_LOG_H__,否則這個(gè)頭文件在編譯時(shí)候會(huì)變成一個(gè)空文件.由于有了這個(gè)宏判斷,我們?cè)谝院蟮乃性创a中就可以重復(fù)的包含這個(gè)頭文件,而不用擔(dān)心頭文件中的一些信息的重復(fù)定義. 
  • 宏定義 __cplusplus
      上述代碼中的#ifdef __cplusplus 用來(lái)判斷當(dāng)前使用的編譯器是C++編譯器還是C編譯器.如果使用C++編譯器則會(huì)自動(dòng)定義這個(gè)宏,否則不會(huì)定義.如果是C++編譯器我們后面增加了 extern 'C' {以及后面的}用來(lái)表示我們的代碼是C語(yǔ)言代碼,這樣通過(guò)C++編譯器編譯出來(lái)的函數(shù)庫(kù)我們?cè)贑語(yǔ)言中也可以使用. 
  • 結(jié)構(gòu)定義CLog
      上述代碼中的typedef struct _CLog CLog可以用力隱藏結(jié)構(gòu)CLog的內(nèi)部情況.這樣我們可以在源代碼中指明CLog的結(jié)構(gòu)成員.而在其它源代碼中看不到這個(gè)結(jié)構(gòu)的各個(gè)成員,起到對(duì)結(jié)構(gòu)的隱藏作用

(五)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)物了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多