#define MAX(x,y) (((x) > (y)) ? (x) : (y))++/--,否則 MAX(i++, j) 導致多次求值。do { ... } while(0) 包裹多語句宏(本文示例多為單表達式,故省略)。#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)
#define SHIFT(value, n) (((n) > 0) ? ((value) << (n)) : ((value) >> (-(n))))
#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 等),支持本地化且無副作用風險。
#define ABSOLUTE_VALUE(x) (((x) < 0) ? -(x) : (x))
⚠️ ABS(INT_MIN) 仍為負數(溢出),嚴謹場景需用函數處理。
##define dprint(expr) printf(#expr " = %.1f\n", expr)
// dprint(1.0/2.0) → 輸出: 1.0/2.0 = 0.5
###define xprint(front, back) front ## back
// xprint(x, 1) → 展開為 x1
#define LEAP_YEAR(y) (((y) % 4 == 0 && (y) % 100 != 0) || ((y) % 400 == 0))
#define BIT(val, n) ((((val) >> (n)) & 1) ? 1 : 0)
_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; } —— 類型安全、可調試、無副作用。宏仍在「編譯期計算」、「字符串化」、「符號拼接」、「平台適配」等場景不可替代,但能用函數解決的盡量用函數。