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;
}
/* 《程式語言教學誌》的範例程式
http://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;
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:u1401_2.cpp
功能:示範 C++ 的前置處理器
作者:張凱慶*/
此例先定義一個巨集常數 DEMO1
#define DEMO1 10
然後判斷 DEMO1 及 DEMO2 是否存在。編譯執行,結果如下
$ g++ u1401_2.cpp |
$ ./a.out |
demo1 |
no demo2 |
$ |
一個常見的應用是在標頭檔中判斷是否已經引入,例如
#ifndef DATA_H
#define DATA_H
// data.h
#endif DATA_H
相關教學影片