而在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文件中。