C可變引數 printf(巨集處理可變引數)

2021-09-26 15:52:43 字數 590 閱讀 6959

x86平台下的巨集定義: 

typedef char* va_list;

/* 記憶體對齊;

* 與sizeof(int)對齊;

* 0 < sizeof(n) <= 4, _intsizeof(n) = 4;

* 4 < sizeof(n) <= 8, _intsizeof(n) = 8;

*/#define _intsizeof(n) ((sizeof(n)_sizeof(int)-1)&~(sizeof(int)-1))

/* 可變引數起始位置

* &v -- 最後乙個固定引數的起始位址

* ap -- 可變引數起始位置

*/#define va_start(ap, v) (ap = (va_list)&v + _intsizeof(v))

/* 強制型別轉換

* 移動引數指標ap指向下乙個引數

*/#define va_arg(ap, t) (*(t*)((ap += _intsizeof(t)) - _intsizeof(t)))

#define va_end(ap) (ap = (va_list)0)

C語言可變引數巨集

歲月不饒人,這年紀大了記憶力真是差了很多。今天寫程式需要用到可變引數的巨集,可是忘了怎麼寫,這倒也沒什麼,因為我一向是不記憶這些語法細節的,反正我知道程式裡有個地方用到了這種技巧,但是可悲的是我忘了在哪個地方。搜尋?語法都忘了蒐個p呀。只好憑著印象,在自己負責的模組 中找了一圈,花了十幾分鐘才終於在...

C 可變引數的巨集

可變引數的巨集 1.可變引數的巨集是c99規範開始支援的,具體用法如下 define debug printf va args 預設號代表乙個可以變化的參數列。使用保留名 va args 把引數傳遞給巨集。當巨集的呼叫展開時,實際的引數就傳遞給 printf 了。如果預設號之前有逗號,就要寫成下面的...

可變引數巨集

在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 void printf con...