C++ 速查手冊 V1.00 - 單元 14.1 - 條件編譯




條件編譯 (conditional compilation) 用來判斷常數運算式的結果,例如某個識別字名稱是否存在,如果不存在就用 #define 定義。條件編譯有以下的指令


指令語法 功能
#if expr 判斷 expr 是否為真。
#ifdef expr 判斷 expr 是否有定義。
#ifndef expr 判斷 expr 是否沒有定義。
#elif expr 當上述指令結果為假時的另一個條件。
#else 當上述指令皆假時所執行的部份。
#endif 結束條件編譯。

舉例如下


001 #include <iostream>
002
003 int main() {
004 #if -1 > 0
005    std::cout << "mm"
006              << std::endl;
007 #elif 1 > 0
008    std::cout << "ok"
009              << std::endl;
010 #else
011    std::cout << "xx"
012              << std::endl;
013 #endif
014
015    return 0;
016 }
017  
018 /* Kaiching Chang 
019    u1401_1.cpp
020    2014-02 */

這裡用了 #if#elif#else#endif ,用法類似 if-else 陳述


004 #if -1 > 0
005    std::cout << "mm"
006              << std::endl;
007 #elif 1 > 0
008    std::cout << "ok"
009              << std::endl;
010 #else
011    std::cout << "xx"
012              << std::endl;
013 #endif

編譯執行,結果如下


$ g++ u1401_1.cpp
$ ./a.out
ok
$

前置處理器指令結尾都不需要加上分號。

另舉一例使用 #if


001 #include <iostream>
002 #define DEMO1 10
003
004 int main() {
005 #ifdef DEMO1
006    std::cout << "demo1"
007              << std::endl;
008 #else
009    std::cout << "no demo1"
010              << std::endl;
011 #endif
012
013 #ifndef DEMO2
014    std::cout << "no demo2"
015              << std::endl;
016 #else
017    std::cout << "demo2"
018              << std::endl;
019 #endif
020
021    return 0;
022 }
023  
024 /* Kaiching Chang 
025    u1401_2.cpp
026    2014-02 */

此例先定義一個巨集常數 DEMO1


002 #define DEMO1 10

然後判斷 DEMO1DEMO2 是否存在。編譯執行,結果如下


$ g++ u1401_2.cpp
$ ./a.out
demo1
no demo2
$

一個常見的應用是在標頭檔中判斷是否已經引入,例如


    #ifndef DATA_H
    #define DATA_H
    // data.h
    #endif DATA_H

continue ...

沒有留言: