#ifndef COMDEF_H
#define COMDEF_H
/* 內容 */
#endif
typedef uint32_t uint32; // C99 stdint.h 標準類型
typedef int32_t int32;
typedef uint16_t uint16;
typedef int16_t int16;
typedef uint8_t uint8;
typedef int8_t int8;
| 宏 | 定義 | 用途 |
|---|---|---|
| MAX/MIN | #define MAX(x,y) ((x)>(y)?(x):(y)) | 類型無關極值 |
| 數組元素數 | #define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) | 編譯期常量 |
| 結構體成員偏移 | #define FPOS(type,field) ((size_t)&(((type*)0)->field)) | 序列化/反射 |
| 字節序轉換 | #define FLIPW(p) (((p)[0]<<8)|(p)[1]) | 大端/小端 |
| 8 字節對齊 | #define RND8(x) (((x)+7)/8*8) | 記憶體對齊 |
| 字符分類 | #define DECCHK(c) ((c)>='0'&&(c)<='9') | 無庫函數依賴 |
#define DEBUG_LOG(fmt, ...) fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
// 使用:DEBUG_LOG("value=%d", x);
##__VA_ARGS__ 會在參數為空時吞掉前面的逗號,避免語法錯誤。
#ifdef _DEBUG
#define TRACE(msg) printf("[TRACE %s:%d] %s\n", __FILE__, __LINE__, msg)
#else
#define TRACE(msg)
#endif
#define SQR(x) ((x)*(x)) 防止 SQR(a+b) 展開錯誤。#define DOIT() do{...}while(0) 使宏像語句一樣可跟分號,避免 if() DOIT(); else ... 報錯。MAX(i++, j++) 導致遞增兩次,改用內聯函數或 GNU statement expression:#define MAX(x,y) ({typeof(x)_x=(x);typeof(y)_y=(y);_x>_y?_x:_y;})。