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

C語言宏定義進階技巧:類型安全、調試追蹤、跨平台移植

     編輯:關於C語言

防止頭文件重複包含


#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')無庫函數依賴

可變參數宏(C99)


#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) 展開錯誤。
  • 多語句用 do-while(0):#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;})。
  • 不要在宏中定義靜態變量,每次展開都是新定義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved