漂亮的宏定義能防錯、增移植性、提可讀性。本文匯總成熟項目中驗證的 20 類經典宏模式,涵蓋類型抽象、位操作、調試追蹤、安全防護等核心場景。
#ifndef COMDEF_H
#define COMDEF_H
// 內容
#endif
#define ADD(a,b) ((a)+(b)) // 單表達式
#define DO(a,b) do { a+b; a++; } while(0) // 多語句,防 if-else 掉坑
<stdint.h>)
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
typedef signed char int8;
typedef signed short int16;
typedef signed long int32;
// 不建議:byte/word/dword 等非標準別名
typedef unsigned char uint1; // 8bit
typedef unsigned short uint2; // 16bit
typedef unsigned long uint4; // 32bit
#define MEM_B(x) (*((uint8*)(x)))
#define MEM_W(x) (*((uint16*)(x)))
#define FPOS(type, field) ((size_t)&(((type*)0)->field))
#define FSIZ(type, field) (sizeof(((type*)0)->field))
#define B_PTR(var) ((uint8*)(void*)&(var))
#define W_PTR(var) ((uint16*)(void*)&(var))
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MIN(x,y) (((x)<(y))?(x):(y))
#define FLIPW(ray) ((((uint16)(ray)[0]) << 8) | (ray)[1])
#define FLOPW(ray,val) do { (ray)[0]=(val)>>8; (ray)[1]=(val)&0xFF; } while(0)
#define WORD_LO(x) ((uint8)((uint16)(x) & 0xFF))
#define WORD_HI(x) ((uint8)(((uint16)(x) >> 8) & 0xFF))
#define RND8(x) ((((x)+7)/8)*8) // 8 字節對齊
#define MOD_BY_POWER_OF_TWO(val, mod) ((val) & ((mod)-1)) // mod 必須是 2^n
#define UPCASE(c) (((c)>='a'&&(c)<='z')?((c)-0x20):(c))
#define DECCHK(c) ((c)>='0'&&(c)<='9')
#define HEXCHK(c) (DECCHK(c)||((c)>='A'&&(c)<='F')||((c)>='a'&&(c)<='f'))
#define INC_SAT(val) ((val) = ((val)+1 > (val)) ? (val)+1 : (val))
#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0]))
#define inp(port) (*(volatile uint8*)(port))
#define inpw(port) (*(volatile uint16*)(port))
#define inpdw(port) (*(volatile uint32*)(port))
#define outp(port,val) (*(volatile uint8*)(port)=(uint8)(val))
#define outpw(port,val) (*(volatile uint16*)(port)=(uint16)(val))
#define outpdw(port,val) (*(volatile uint32*)(port)=(uint32)(val))
__LINE__ // 當前行號
__FILE__ // 當前文件名
__DATE__ // 編譯日期 "Mmm dd yyyy"
__TIME__ // 編譯時間 "hh:mm:ss"
__STDC__ // 標準 C 則為 1
#ifdef _DEBUG
#define DEBUGMSG(msg, data) printf(msg); printf("%d %d %s", data, __LINE__, __FILE__)
#else
#define DEBUGMSG(msg, data)
#endif
#define STR(x) #x
#define CONCAT(a,b) a##b
// 用法:STR(hello) → "hello";CONCAT(var,1) → var1
#define SQUARE(x) ((x)*(x))SQUARE(i++) 會展開兩次自增PROJ_MAX宏是 C 語言元編程的基石。掌握這 20 類模式,能應對 90% 工程場景。但請記住:能用語言機制(函數、模板、常量)解決的,絕不動用宏。