#if 0
// 這裡的程式碼會被編譯器完全忽略
int debug_code = 1;
printf("Debug: %d\n", debug_code);
#endif
#if 1
// 這裡的程式碼正常編譯
int release_code = 2;
#endif
將除碼相關程式碼包在 `#if 0` 中,發布時改為 `#if 1` 即可啟用,無需刪除程式碼。
#if 0 // 除碼版本設為 1
log_debug("進入關鍵函數");
dump_memory_buffer(ptr, size);
#endif
傳統 `/* */` 註解不支援巢狀,若註解區塊內已有 `/* */` 會導致編譯錯誤。`#if 0` 完美解決此問題:
/* 這裡有巢狀註解會出錯
/* 內層註解 */
程式碼...
*/
#if 0 // 完美支援巢狀
/* 內層註解完全沒問題 */
程式碼...
#if 0 // 甚至可再巢狀
更多程式碼...
#endif
#endif
重構時不確定新邏輯是否正確,舊邏輯用 `#if 0` 保留,隨時可回滾:
// 新版演算法
int result = new_algorithm(input);
#if 0 // 舊版備份,隨時可啟用對比
// 舊版演算法
int result = old_algorithm(input);
#endif
雖然 C89 不支援區塊作用域變數宣告,但配合 `#if 1` 可模擬:
void func() {
int a = 1;
#if 1
int b = 2; // 視覺上限制在這個區塊
a += b;
#endif
// b 在這裡仍可見(C 語言實際規則),但程式碼結構暗示意圖
}
注意:這只是視覺上的結構化,實際作用域仍受 C 標準限制。C99+ 直接支援區塊作用域。
#include <iostream>
int main(void) {
int a = 0;
#if 0
a = 1; // 這行不會執行
#endif
printf("%d\n", a); // 輸出 0
return 0;
}
#if 0 // TODO: 待新介面穩定後移除舊版邏輯
legacy_process(data);
#endif
| 特性 | /* */ 註解 | #if 0 / #endif |
|---|---|---|
| 巢狀支援 | ❌ 不支援 | ✅ 完美支援 |
| 條件編譯 | ❌ 無法條件控制 | ✅ 可用巨集控制 |
| 編譯器處理 | 詞法分析階段移除 | 前置處理階段保留/移除 |
| 除錯器可見性 | 不可見 | 不可見(同樣被移除) |
| 適用場景 | 單行/小區塊說明 | 大區塊停用、條件編譯 |
掌握 `#if 0` 技巧能顯著提升程式碼維護靈活性,是 C/C++ 開發者必備技能之一。