一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

預(yù)編譯#define #ifdef #endif

 清華研究生 2011-10-27
預(yù)編譯#define #ifdef #endif
2008-01-20 12:04
最近在用C語寫一些程序,發(fā)現(xiàn)#ifdef,#else,#endif和#ifndef,#else,#endif在UCOS-II中有大量的應(yīng)用,于是到網(wǎng)上查了一些相關(guān)的解釋.
#ifdef的用法

靈活使用#ifdef指示符,我們可以區(qū)隔一些與特定頭文件、程序庫和其他文件版本有關(guān)的代碼。
代碼舉例:新建define.cpp文件

#include "iostream.h"
int main()
{
#ifdef DEBUG      
cout<< "Beginning execution of main()";
#endif      
return 0;
}
運行結(jié)果為:Press any key to continue

改寫代碼如下:
#include "iostream.h"
#define DEBUG
int main()
{
#ifdef DEBUG      
cout<< "Beginning execution of main()";
#endif       
return 0;
}
運行結(jié)果為:
Beginning execution of main()
                     Press any key to continue

更一般的情況是,#define語句是包含在一個特定的頭文件中。
比如,新建頭文件head.h,在文件中加入代碼:

#ifndef DEBUG
#define DEBUG
#endif

而在define.cpp源文件中,代碼修改如下:
#include "iostream.h"
#include "head.h"
int main(){
#ifdef DEBUG      
cout<< "Beginning execution of main()";
#endif       
return 0;
}
運行結(jié)果如下:
Beginning execution of main()
                        Press any key to continue
結(jié)論:通過使用#ifdef指示符,我們可以區(qū)隔一些與特定頭文件、程序庫和其他文件版本有關(guān)的代碼。
"#ifdef"的運用
"#ifdef"在C++中運用
常常在建立header file的時候需要先寫一段文字

比如下面這段話

#ifdef HEADERFILENAME_H

#define HEADERFILENAME_H


class ClassName

{

...

};

#endif
那段#ifdef有必要寫嗎?

其實有些無寫都不會影響代碼的Runtime

不過對運行速度和文件大小有一定的影響

大概很多人很喜歡用#i nclude來抓取文件吧

炎也很喜歡

總是在main.cpp中include一次

然后又在classfile.cpp中又使用一次

每次都include同樣的Headerfile.h

這樣就導(dǎo)致了Compiler運作的時候在link的時候會重復(fù)同樣的headerfile內(nèi)容

相同重復(fù)的內(nèi)容出現(xiàn)就有可能導(dǎo)致不良的情況的發(fā)生

即時沒有compilerError或者RunrimeError

也會讓程序運行緩慢,想想看吧,在重復(fù)compiler一段Code之后產(chǎn)生的程序大小
預(yù)處理命令之條件編譯(#ifdef,#else,#endif,#if等)

預(yù)處理就是在進行編譯的第一遍詞法掃描和語法分析之前所作的工作。說白了,就是對源文件進行編譯前,先對預(yù)處理部分進行處理,然后對處理后的代碼進行編譯。這樣做的好處是,經(jīng)過處理后的代碼,將會變的很精短。
   關(guān)于預(yù)處理命令中的文件包含(#i nclude),宏定義(#define),書上已經(jīng)有了詳細(xì)的說明,在這里就不詳述了。這里主要是對條件編譯(#ifdef,#else,#endif,#if等)進行說明。以下分3種情況:

1:情況1:
#ifdef _XXXX
...程序段1...
#else
...程序段2...
#endif
   這表明如果標(biāo)識符_XXXX已被#define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。

例:
#define NUM
.............
.............
.............
#ifdef NUM
   printf("之前NUM有過定義啦!:) \n");
#else
   printf("之前NUM沒有過定義!:( \n");
#endif
}
   如果程序開頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時候,當(dāng)然執(zhí)行第一個printf。否則第二個printf將被執(zhí)行。
   我認(rèn)為,用這種,可以很方便的開啟/關(guān)閉整個程序的某項特定功能。


2:情況2:
#ifndef _XXXX
...程序段1...
#else
...程序段2...
#endif
   這里使用了#ifndef,表示的是if not def。當(dāng)然是和#ifdef相反的狀況(如果沒有定義了標(biāo)識符_XXXX,那么執(zhí)行程序段1,否則執(zhí)行程序段2)。例子就不舉了。


3:情況3:
#if 常量
...程序段1...
#else
...程序段2...
#endif
   這里表示,如果常量為真(非0,隨便什么數(shù)字,只要不是0),就執(zhí)行程序段1,否則執(zhí)行程序段2。
   我認(rèn)為,這種方法可以將測試代碼加進來。當(dāng)需要開啟測試的時候,只要將常量變1就好了。而不要測試的時候,只要將常量變0。

# ifdef   #ifndef 等用法

文件中的#ifndef

頭件的中的#ifndef,這是一個很關(guān)鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,于是問題來了,大量的聲明沖突。

還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:

#ifndef <標(biāo)識>
#define <標(biāo)識>

......
......

#endif

<標(biāo)識>在理論上來說可以是自由命名的,但每個頭文件的這個“標(biāo)識”都應(yīng)該是唯一的。標(biāo)識的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_

......

#endif

2.在#ifndef中定義變量出現(xiàn)的問題(一般不定義在#ifndef中)。

#ifndef AAA
#define AAA
...
int i;
...
#endif
里面有一個變量定義
在vc中鏈接時就出現(xiàn)了i重復(fù)定義的錯誤,而在c中成功編譯。

結(jié)論:

(1).當(dāng)你第一個使用這個頭的.cpp文件生成.obj的時候,int i 在里面定義了當(dāng)另外一個使用這個的.cpp再次[單獨]生成.obj的時候,int i 又被定義然后兩個obj被另外一個.cpp也include 這個頭的,連接在一起,就會出現(xiàn)重復(fù)定義.

(2).把源程序文件擴展名改成.c后,VC按照C語言的語法對源程序進行編譯,而不是C++。在C語言中,若是遇到多個int i,則自動認(rèn)為其中一個是定義,其他的是聲明。

(3).C語言和C++語言連接結(jié)果不同,可能(猜測)時在進行編譯的時候,C++語言將全局
變量默認(rèn)為強符號,所以連接出錯。C語言則依照是否初始化進行強弱的判斷的。(參考)

解決方法:

(1).把源程序文件擴展名改成.c。

(2).推薦解決方案:
.h中只聲明 extern int i;在.cpp中定義

<x.h>
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__
<x.c>
int i;

注意問題:

變量一般不要定義在.h文件中。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    一本色道久久综合狠狠躁| 国产精品欧美激情在线观看| 亚洲av在线视频一区| 污污黄黄的成年亚洲毛片| 五月激情综合在线视频| 九九热精彩视频在线播放| 国内精品伊人久久久av高清| 国产成人午夜福利片片| 99久久人妻中文字幕| 成人精品亚洲欧美日韩| 欧美日韩一区二区三区色拉拉| 国产成人av在线免播放观看av| 亚洲av熟女国产一区二区三区站| 中文字幕乱子论一区二区三区| 亚洲在线观看福利视频| 亚洲欧美中文字幕精品| 久久亚洲国产视频三级黄| 色无极东京热男人的天堂| 欧美日本精品视频在线观看| 国产一区二区三区草莓av| 亚洲中文字幕在线乱码av| 色综合伊人天天综合网中文| 成年男女午夜久久久精品| 成人免费观看视频免费| 91日韩在线观看你懂的| 国产高清视频一区不卡| 欧美日韩国产黑人一区| 国产在线小视频你懂的| 98精品永久免费视频| 这里只有九九热精品视频| 麻豆国产精品一区二区| 欧美日韩成人在线一区| 欧洲偷拍视频中文字幕| 在线观看免费视频你懂的| 国产欧美日韩视频91| 2019年国产最新视频| 久热人妻中文字幕一区二区| 亚洲日本久久国产精品久久| 欧美黑人黄色一区二区| 精品少妇人妻av一区二区蜜桃 | 欧美日本亚欧在线观看|