你需要的ifndef屎篱、endif宏定義

首先项乒,讓我們先從頭文件開始啰劲,在很多頭文件里,我們會看到這樣的語句

#ifndef _MYHEADFILE_H  
#define _MYHEADFILE_H
// .......語句......
#endif // _MYHEADFILE_H

為了避免同一個文件被include多次,我們常使用 #ifndef進行判斷板丽,如果沒有包含_MYHEADFILE_H, 則使用#define 來定義一個宏_MYHEADFILE_H , #endif#ifndef首尾呼應呈枉,表示結束。

說到這里埃碱,我們有必要提一個C語言中的預處理器猖辫,預處理器是一個小軟件,它可以在編譯前處理C程序砚殿,它的行為是由預處理指令控制的啃憎,預處理指令包含了以下內容:

  1. 宏定義 #define
  2. 文件包含 #include
  3. 條件編譯 #if
  4. #ifdef

#ifndef

#if defined

#if !defined

#elif

#else

#endif

#undef

指令都是以#開始的

我們來看一下簡單的宏定義(對象式宏)

#define 標準符 替換列表

#define PI 3.1415926

可以對類型重命名

#define BOOL int

宏可以帶參數,也是常說的宏函數

#define 標識符(x1,x2...) 替換列表

特別注意的是標識符和(之間不能有空格似炎,圓括號是必須的辛萍。

我們來看一下例子:

  #define MAX(x,y) ((x)>(y)?(x):(y))
  #define IS_EVEN(n) ((n)%2==0)
  #define TOUPPER(c) (‘a’<(c)&&(c)<’z’?(c)-’a’+’A’(c))
  #define SWAP(T,x,y) {T t=x; x=y; y=t}

還可以寫得更復雜一點,比如我們來寫一個宏函數羡藐,用它來驗證一個日期是否合法

  #define ISLEAP(y) ((y)%4==0&&(y)%100!=0||(y)%400==0)
  #define ISSMALL(m) ((m)==4||(m)==6||(m)==9||(m)==11)
  #define NORMAL(m) (ISSMALL(m)?30:31)
  #define DAYS(y,m) ((m)==2?28+ISLEAP(y):NORMAL(m))
  #define IN(x, from,to) ((x)>=(from)&&(x)<=(to))
  #define VALID(y,m,d) ((y)>1600&&IN(m,1,12)&&IN(d,1,DAYS(y,m)))

下面我們來看看條件編譯

#if (comdition)
{//語句##贩毕;}
#endif

如果(comdition)為真, 也就是邏輯1的話仆嗦,編譯下面的語句辉阶,如果(comdition)為假,即邏輯0瘩扼,則不編譯下面的語句谆甜。例子如下:

  #define DEBUG
  #if DEBUG
  Printf(“Value of i:%d\n”, i);
  Printf(“Value of j:%d\n”, j);
  #endif

格式:
#if 常量表達式

常量表達式為0時,預處理器刪除#if#endif中間的代碼

#if 會把沒有定義過的標準符視做為0集绰, 如果沒有定義DEBUG, 則測試#if DEBUG 會失敗规辱,但#if !DEBUG會成功。

可以用宏來定義文件名:

  #if define(IA32)
  #define CPU_FILE “ia32.h”
  #elif defined(IA64)
  #deifine CPU_FILE “ia64.h”
  #elif defined(AMD64)
  #define CPU_FILE “amd64.h”
  #endif
  #include CPU_FILE

還可以取消已經定義的宏

  #if defined VALUE              // 檢驗VALUE是否被定義 栽燕,如果被定義
  #undef VALUE                   // 解除語句定義
  #define VALUE 1000             //  重新定義VALUE 為1000
  #endif
  如果檢驗沒有定義罕袋,可以這樣寫:
  #ifndef VALUE                 // 如果VALUE沒有被定義
  #define VALUE 1000            //  定義VALUE 為1000
  #endif

以上所用的宏中:

#undef為解除定義;

#ifndefif not defined的縮寫改淑,也可以寫成#if !defined 即如果沒有定義;

#ifdefif defined的縮寫,也可以寫成#if defined 即檢查是否定義過;

#ifdef#if defined 的區(qū)別炫贤,#ifndef#if !defined 的區(qū)別相類似溅固,都在于后者可以組成復雜的預編譯條件,前者只判斷單個宏是否定義,例如:

  #if defined(PERL_PACK_CAN_SHRIEKSIGN)
  /* v */ SIZE16,
  #else
  0,
  #endif
  #ifdef PERL_PACK_CAN_SHRIEKSIGN
  /* v */ SIZE16,
  #else
  0,
  #endif
  #ifdef是種簡寫兰珍,但不支持更復雜的表達式侍郭。
  #ifdef HAVE_MYHEADER
  # if VERSION > 3
  ...
  # endif
  #endif
  這種情況用
  #if defined(HAVE_MYHEADER) && VERSION > 3
  ...
  #endif
  更為合理
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掠河,隨后出現(xiàn)的幾起案子亮元,更是在濱河造成了極大的恐慌,老刑警劉巖唠摹,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爆捞,死亡現(xiàn)場離奇詭異,居然都是意外死亡勾拉,警方通過查閱死者的電腦和手機煮甥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藕赞,“玉大人成肘,你說我怎么就攤上這事「桑” “怎么了双霍?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長批销。 經常有香客問我洒闸,道長,這世上最難降的妖魔是什么均芽? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任丘逸,我火速辦了婚禮,結果婚禮上掀宋,老公的妹妹穿的比我還像新娘鸣个。我一直安慰自己,他們只是感情好布朦,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昼窗,像睡著了一般是趴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澄惊,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天唆途,我揣著相機與錄音富雅,去河邊找鬼。 笑死肛搬,一個胖子當著我的面吹牛没佑,可吹牛的內容都是我干的。 我是一名探鬼主播温赔,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蛤奢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陶贼?” 一聲冷哼從身側響起啤贩,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拜秧,沒想到半個月后痹屹,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枉氮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年志衍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聊替。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡楼肪,死狀恐怖,靈堂內的尸體忽然破棺而出佃牛,到底是詐尸還是另有隱情淹辞,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布俘侠,位于F島的核電站象缀,受9級特大地震影響,放射性物質發(fā)生泄漏爷速。R本人自食惡果不足惜央星,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惫东。 院中可真熱鬧莉给,春花似錦、人聲如沸廉沮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滞时。三九已至叁幢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坪稽,已是汗流浹背曼玩。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工鳞骤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黍判。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓豫尽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顷帖。 傳聞我的和親對象是個殘疾皇子美旧,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容

  • C中的預編譯宏定義 2009-02-10 作者: infobillows 來源:網絡 在將一個C源程序轉換為可執(zhí)行...
    白水灬煮一切閱讀 1,583評論 0 5
  • 目錄 一.預處理的工作方式... 3 1.1.預處理的功能... 3 1.2預處理的工作方式... 3 二.預處理...
    朱森閱讀 1,363評論 0 2
  • 作者 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)窟她。轉載請注明出處陈症。原文:https://www.ji...
    程序員聯(lián)盟閱讀 2,619評論 3 42
  • #ifndef在頭文件中的作用 在一個大的軟件工程里面,可能會有多個文件同時包含一個頭文件震糖,當這些文件編譯鏈接成一...
    可可西李閱讀 481評論 0 1
  • 寫下這個題目時录肯,我竟有些慌亂。仿佛是害怕什么吊说。平復了心情论咏,理了理頭緒。現(xiàn)在颁井,來慢談我眼中的愛情厅贪。 我也總...
    我是粵閱讀 178評論 0 0