C 可變引數的巨集

2022-02-02 11:24:54 字數 1011 閱讀 9019

可變引數的巨集:

1. 可變引數的巨集是c99規範開始支援的,具體用法如下:

#define debug(…) printf(__va_args__)

預設號代表乙個可以變化的參數列。使用保留名 __va_args__ 把引數傳遞給巨集。當巨集的呼叫展開時,實際的引數就傳遞給 printf() 了。

如果預設號之前有逗號,就要寫成下面的形式:

#define debug(format, ...) printf (format, ##__va_args__)

' ## '的意思是,如果可變引數被忽略或為空,將使預處理器(preprocessor)去除掉它前面的那個逗號。

2. 編譯器內建的巨集定義:

ansi c的標準預定義巨集:

__date__ : 以「月 日 年」的格式替換為當前日期,型別為字串

__file__  : 替換為當前源檔名包括路徑,型別為字串

__line__ : 替換為當前行號,可以結合#line進行設定,#line之後的數字代表#line下一行的行號,之後行號以此類推,型別為整型值

__stdc__ : 當要求程式嚴格遵循ansi c標準時該標識被賦值為1

__time__ : 以「時:分:秒」的格式替換為當前時間,型別為字串

__timestamp__ : 以」星期  月  日  時:分:秒 年「的格式替換為最後一次修改當前原始檔的時間,型別為字串

詳細描述見:

3. 兩者結合就可以生成很有用的除錯輸出巨集,像這樣:

#define __debug__  #ifdef __debug__  

#define debug(format,...) printf("line:%4d time:"__time__" " format"\n",__line__,##__va_args__)

#else

#define debug(format,...)

#endif

view code

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

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 s...

C語言可變引數巨集

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

可變引數巨集

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