條件編譯(#ifdef #else #endif #if)

時間:2014.07.01

地點:基地

----------------------------------------------------------------------------

一、預處理

  細說條件編譯前,先了解下預處理過程。預處理過程讀入源碼,即對源碼進行掃描,檢查包含的預處理指令和宏定義,對其進行初步轉換,然後再將產生的這種新源碼提供給編譯器。預處理過程還會刪除程序中的註釋和多餘的空白字符。
  預處理指令以#號開頭,後跟指令關鍵字,指令將在編譯器對源碼進行編譯之前對源碼做某些轉換。常用的預處理指令有如下:
#空指令               //無任何效果
#include<>          //包含一個源碼文件
#define                //定義一個宏
#undef                //取消已定義的宏
#if                       //如果給定條件爲真,則編譯如下代碼
#ifdef                  //如果宏沒有定義,則編譯下面代碼
#ifndef                //如果宏沒有定義,則編譯下面代碼
#elif                    //如果前面的#if給定條件不爲真,而滿足當前分支條件,則編譯下面代碼
#endif                 //結束一個#if...#else條件編譯塊
#error                 //停止編譯並顯示錯誤信息
#line                   //改變編譯器用來指出警告和錯誤信息的文件號和行號
#pragma             //編譯器自定義用途,一般是禁止或允許某些煩人的警告信息

----------------------------------------------------------------------------

二、文件包含

#include預處理指令的功能是在指令處展開被包含的文件。這種包含是多重的,即在一個被包含的文件中還可以包含其他文件。預處理過程不會檢查在轉換單元中是否已經包含了某個文件並阻止它的重複(多次)包含。於是,我們可以通過給定編譯時條件來達到不同的效果。比如:
爲了避免只能包含一次的頭文件被重複包含,我們可以在頭文件中用編譯時條件進行控制。//my header file
//my_header.h
#ifndef MY_HEADER_H
#define MY_HEADER_H
......
#endif
在程序中包含頭文件的方式
1.用尖括號include,形如:
#include<myheader.h>
這種方式告訴預處理器程序在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件。
2.用雙引號include,形如:
#include"myheader.h"
這種方式告訴預處理器程序在當前被編譯的應用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。

----------------------------------------------------------------------------
三、條件編譯
  條件編譯指令將決定哪些代碼被編譯哪些代碼不被編譯,就向在程序中,哪段代碼將在什麼樣的條件下降被執行。
1.#if指令
#if指令檢測後面的編譯條件(一個常量表達式),爲真則編譯後面的代碼,直到出現#else、#elif或#endif爲止。爲假則不編譯。
2.#endif指令
#endif用於終止#if預處理指令。
比如:

#define DEBUG 0
int main()
{
  #if DEBUG 
  printf("Debugging");
  #endif
  printf("Running");
}
由於這裏程序定義DEBUG宏代表0,所以#if條件爲假,不能編譯後面的代碼直到#endif,所以程序直接輸出Running。若是去掉#defin語句也一樣.
3.#elif指令
#elif預處理指令綜合了#else和#if指令的功能
#define FLAG
{
  #ifdef ONE
  print("1");
  #elif defined TWO
  printf("2");
  #else
  printf("3");
  #endif
}
最後輸出2
條件編譯情況1
#ifdef XXXX
...程序段1.。。
#else
...程序段2.。。
#endif
表明如果標識符XXXX已經被#define命令定義過,則對程序段1進行編譯,否則對程序段2進行編譯。
比如:
#define NUM
......
#ifdef NUM
printf("is already define NUM");
#else
printf("is not define NUM");
#endif

如果程序開頭已有#define NUM這樣的一行,即NUM已經被定義,那麼,碰到下面的#ifdef NUM的時候,就會執行第一個printf,否則如果上面沒有這行定義,就執行第二個printf.
總結一點說:用這種方式,可以很方便的開啓和關閉整個程序的某些特定功能
2.情況2
#ifndef XXXX
...程序段1
#else
...程序段2
#endif
現在使用的是#ifndef,即如果沒定義標識符XXXX,那麼就會編譯程序段1,否則就編譯程序段2
3.情況2
#if 常量
...程序段1
#else
...程序段2
#endif
這裏表示如果常量爲真就編譯程序段1,否則編譯程序段2.
這樣,這種方法可將測試代碼加進來,當需要開啓測試時只要將變量設爲1,而不需要測試時將變量置爲0




發佈了193 篇原創文章 · 獲贊 53 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章