首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言條件編譯完整指南:預處理指令與宏定義實戰

     編輯:關於C語言

C 語言本身不具備檔案包含、宏定義、條件編譯等功能,這些由預處理器在編譯前完成。預處理指令以 # 開頭,常見指令如下:

指令用途
#include包含原始檔
#define定義宏
#undef取消宏定義
#if / #elif / #else / #endif條件編譯區塊
#ifdef / #ifndef檢查宏是否定義
#error停止編譯並報錯
#pragma編譯器專用指令

一、檔案包含 #include

兩種包含格式差異:

  • #include <header.h>:搜尋系統標準庫目錄
  • #include "header.h":優先搜尋當前專案目錄,再搜尋系統目錄

防止重複包含的標準護衛模式:

/* my.h */
#ifndef MY_H
#define MY_H
/* 內容 */
#endif

二、宏定義 #define

1. 物件樣式宏

#define MAX_NUM 10
#define VERSION "Version 1.0"

慣用全大寫命名,提升可讀性且易於維護。宏可引用前序宏:

#define ONE 1
#define TWO 2
#define THREE (ONE + TWO)  /* 建議加括號避免運算優先級問題 */

2. 函數樣式宏(帶參數)

#define CUBE(x) ((x) * (x) * (x))

關鍵規則:參數與整體表達式皆需加括號,防止副作用與優先級錯誤。絕對避免傳遞有副作用的運算式(如 CUBE(i++))。

3. 字串化 # 與連接 ## 運算子

#define STR(s) #s        /* 字串化:STR(abc) → "abc" */
#define CONCAT(a,b) a##b /* 連接:CONCAT(12,34) → 1234 */

三、條件編譯

1. #if / #elif / #else / #endif


#define DEBUG 1
#if DEBUG
  printf("Debug mode\n");
#elif RELEASE
  printf("Release mode\n");
#else
  printf("Unknown\n");
#endif

2. #ifdef / #ifndef

檢查宏定義存在與否,等價於 #if defined(MACRO) / #if !defined(MACRO)。常用於標頭檔護衛與平台差異處理。

3. #error 強制編譯錯誤


#ifndef CONFIG_H
#error "缺少組態檔 config.h"
#endif

實務建議

  • 宏名稱全大寫,避免與變數衝突
  • 複雜宏改用 inline 函數或 constexpr (C++11)
  • 條件編譯區塊保持淺層巢狀,維護可讀性
  • 善用 #pragma once(編譯器支援時)簡化標頭檔護衛
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved