C++ 速查手冊

14.1 - 條件編譯

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

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

舉例如下

#include <iostream>
  
int main() {
#if -1 > 0
    std::cout << "mm" << std::endl;
#elif 1 > 0
    std::cout << "ok" << std::endl;
#else
    std::cout << "xx" << std::endl;
#endif

    return 0;
}

/* 《程式語言教學誌》的範例程式
   https://kaiching.org/
   檔名:u1401_1.cpp
   功能:示範 C++ 的前置處理器
   作者:張凱慶*/

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

#if -1 > 0
    std::cout << "mm" << std::endl;
#elif 1 > 0
    std::cout << "ok" << std::endl;
#else
    std::cout << "xx" << std::endl;
#endif

編譯執行,結果如下

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

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

另舉一例使用 #if

#include <iostream>
#define DEMO1 10

int main() {
#ifdef DEMO1
    std::cout << "demo1" << std::endl;
#else
    std::cout << "no demo1" << std::endl;
#endif

#ifndef DEMO2
    std::cout << "no demo2" << std::endl;
#else
    std::cout << "demo2" << std::endl;
#endif

    return 0;
}

/* 《程式語言教學誌》的範例程式
   https://kaiching.org/
   檔名:u1401_2.cpp
   功能:示範 C++ 的前置處理器
   作者:張凱慶*/

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

#define DEMO1 10

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

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

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

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

上一頁 單元 14 - 前置處理器
回 C++ 速查手冊首頁
下一頁 14.2 - 巨集