C語言中的可變數引數巨集和 說明

2021-10-06 15:00:19 字數 1461 閱讀 8054

有時我們寫程式可能會定義許多debug模式下的除錯列印資訊巨集來替代原有的列印函式,這時就會出現編寫可變數引數巨集的寫法問題,下面就摘要性的寫一下,執行及除錯環境為rh linux 9.0+gcc 3.2.2

首先在gcc中,對可變數引數巨集的支援要強的多,一般我們可以這麼寫:

#define macro_1(fmt, args…) printf(fmt, args)

#define macro_2(fmt, …) printf(fmt,va_args)

這兩種寫法都可以,後面一種是使用了關鍵字__va_args__,它代表巨集**現的…,而前面的寫法就是給可變數的引數定義了乙個名字,就是說在第一種寫法中,args就是代表可變數引數,給出例子:

#include

#define macro_1(fmt, args…) printf(fmt, args)

#define macro_2(fmt, …) printf(fmt,va_args)

int main()

我們可以用gcc -e的引數來得到程式的巨集展開源**,主要部分如下:

int main()

大家可以看到這裡的對比.但有乙個問題就是,如果我們只傳遞乙個引數會怎麼呢?也就是把源**改寫如下:

#include

#define macro_1(fmt, args…) printf(fmt, args)

#define macro_2(fmt, …) printf(fmt,va_args)

int main()

這樣會不會有問題呢,我們看一下巨集展開後的**:

int main()

這裡多出現了乙個",",問題的解決方法是在args和__va_args__前面加乙個##,##表示去除它前面的",",但當我們傳遞多於乙個引數的時候這也能工作,就像第一段**一樣,現在看一下加了##之後的**及相應巨集展開後的**:

#include

#define macro_1(fmt, args…) printf(fmt, ##args)

#define macro_2(fmt, …) printf(fmt, ##va_args)

int main()

展開巨集之後:

int main()

問題解決了_。

其實,##在c語言裡功能不只是這個,它還可以起到連線兩個變數的作用,看下面的**:

#include

#define union(a,b) (a##b)

int main()

這裡開了乙個小玩笑,就是把乙個字串的名字起得很長,然後再通過##把它們粘起來並輸入,後面是把兩個整數合併到一起,組成乙個大的整數,展開巨集之後的**如下:

int main()

輸出如下:

test:

str:hello,world! num:108

C語言中可變引數的巨集定義

printf 和fprintf 這些輸出函式的引數是可變的,在除錯程式時,你可能希望定義自己的引數可變的輸出函式,那麼可變引數巨集會是乙個選擇。c99中規定巨集可以像函式一樣帶有可變引數,比如 define log format,fprintf stdout,format,va args 其中,表示...

C語言可變引數巨集

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

C語言中的可變引數

1 需要標頭檔案 include 2 函式定義 void logcmd int arg0,void logcmd char arg0,3 解析 i 數字型別 void logcmd int n,其中n表示引數的個數,n之後才是真正的引數。呼叫如 logcmd 0 logcmd 1,9 logcmd ...