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

C 語言宏定義精粹:從最值判斷到位操作的實戰模板庫

     編輯:關於C語言

宏定義黃金法則

  1. 參數與整體雙重括號:#define MAX(x,y) (((x) > (y)) ? (x) : (y))
  2. 禁用副作用參數:宏中勿用 ++/--,否則 MAX(i++, j) 導致多次求值。
  3. 善用 do { ... } while(0) 包裹多語句宏(本文示例多為單表達式,故省略)。

分類速查表

1️⃣ 最值運算

#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MAX3(x, y, z) MAX(MAX(x, y), z)

2️⃣ 通用移位(正左負右)

#define SHIFT(value, n) (((n) > 0) ? ((value) << (n)) : ((value) >> (-(n))))

3️⃣ 字符分類(ASCII 假設)

#define IS_LOWER_CASE(c)  (((c) >= 'a') && ((c) <= 'z'))
#define IS_UPPER_CASE(c)  (((c) >= 'A') && ((c) <= 'Z'))
#define IS_ALPHABETIC(c)  (IS_LOWER_CASE(c) || IS_UPPER_CASE(c))
#define IS_DIGIT(c)       (((c) >= '0') && ((c) <= '9'))
#define IS_SPECIAL(c)     (!IS_DIGIT(c) && !IS_ALPHABETIC(c))

💡 實際項目建議用 <ctype.h> 標準函數(islower 等),支持本地化且無副作用風險。

4️⃣ 絕對值

#define ABSOLUTE_VALUE(x) (((x) < 0) ? -(x) : (x))

⚠️ ABS(INT_MIN) 仍為負數(溢出),嚴謹場景需用函數處理。

5️⃣ 字符串化運算符 #

#define dprint(expr) printf(#expr " = %.1f\n", expr)
// dprint(1.0/2.0) → 輸出: 1.0/2.0 = 0.5

6️⃣ 符號拼接運算符 ##

#define xprint(front, back) front ## back
// xprint(x, 1) → 展開為 x1

7️⃣ 閏年判斷(格里曆規則)

#define LEAP_YEAR(y) (((y) % 4 == 0 && (y) % 100 != 0) || ((y) % 400 == 0))

8️⃣ 取整數第 N 位(LSB 為第 0 位)

#define BIT(val, n) ((((val) >> (n)) & 1) ? 1 : 0)

進階技巧:類型安全的泛型宏 (C11 _Generic)

#define MAX_GENERIC(x, y) _Generic((x), \
    int: MAX_INT, \
    double: MAX_DOUBLE, \
    default: MAX_INT)((x), (y))

配合 _Generic 可實現編譯期類型分發,避免宏的類型不安全問題。

現代替代方案

  • 內聯函數:static inline int max(int a, int b) { return a > b ? a : b; } —— 類型安全、可調試、無副作用。
  • C++ 模板/constexpr:零開銷抽象的終極形態。

宏仍在「編譯期計算」、「字符串化」、「符號拼接」、「平台適配」等場景不可替代,但能用函數解決的盡量用函數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved