條件編譯可根據不同條件編譯不同程式碼,產生不同目標檔,屬預處理階段功能。
#include <stdio.h>
int main() {
#if _WIN32
system("color 0c");
printf("https://c.biancheng.net\n");
#elif __linux__
printf("\033[22;31mhttps://c.biancheng.net\n\033[22;30m");
#else
printf("https://c.biancheng.net\n");
#endif
return 0;
}
預處理階段保留符合條件的程式碼,其餘捨棄,未定義巨集不會導致編譯錯誤。
#if 完整語法#if 整型常量表達式1
程式段1
#elif 整型常量表達式2
程式段2
#elif 整型常量表達式3
程式段3
#else
程式段4
#endif
if。#elif、#else 可省略。#ifdef / #ifndef#ifdef 巨集名
程式段1
#else
程式段2
#endif
#ifndef 巨集名
程式段1
#else
程式段2
#endif
#ifdef:巨集已定義 → 編譯程式段1。#ifndef:巨集未定義 → 編譯程式段1,功能相反。#else 可省略。#include <stdio.h>
#include <stdlib.h>
int main() {
#ifdef _DEBUG
printf("正在使用 Debug 模式編譯程式...\n");
#else
printf("正在使用 Release 模式編譯程式...\n");
#endif
system("pause");
return 0;
}
VS/VC 中 Debug 定義 _DEBUG,Release 不定義。
#if 後接整型常量表達式(可含運算、邏輯)。#ifdef/#ifndef 後只能接巨集名。// 僅 #if 可用 #if NUM == 10 || NUM == 20 // 多巨集同時存在判斷 #if (defined NUM1 && defined NUM2)
#ifdef 可視為 #if defined 縮寫。