天天看點

gnu c語言可變參數,GNU C和C99标準中的可變參數宏(variadic macros)

用可變參數宏(variadic macros)傳遞可變參數表

你可能很熟悉在函數中使用可變參數表,如:

void printf(const char* format, …);

直到最近,可變參數表還是隻能應用在真正的函數中,不能使用在宏中。

C99編譯器标準終于改變了這種局面,它允許你可以定義可變參數宏(variadic macros),這樣你就可以使用擁有可以變化的參數表的宏。可變參數宏就像下面這個樣子:

#define debug(…) printf(__VA_ARGS__) //最好定義為#define debug(…) printf(##__VA_ARGS__),後面有關于##的說明

預設号代表一個可以變化的參數表。使用保留名 __VA_ARGS__ 把參數傳遞給宏。當宏的調用展開時,實際的參數就傳遞給 printf()了。例如:

Debug(“Y = %d\n”, y);

而處理器會把宏的調用替換成:

printf(“Y = %d\n”, y);

因為debug()是一個可變參數宏,你能在每一次調用中傳遞不同數目的參數:

debug(“test”); //一個參數

可變參數宏不被ANSI/ISO C++ 所正式支援。是以,你應當檢查你的編譯器,看它是否支援這項技術。

用GCC和C99的可變參數宏, 更友善地列印調試資訊

gcc的預處理提供的可變參數宏定義真是好用:

#ifdef DEBUG

#define dbgprint(format,args...) \

fprintf(stderr, format, ##args)

#else

#define dbgprint(format,args...)

#endif

如此定義之後,代碼中就可以用dbgprint了,例如dbgprint("aaa %s", __FILE__);。感覺這個功能比較Cool  :em11:

下面是C99的方法:

#define dgbmsg(fmt,...) \

printf(fmt,##__VA_ARGS__

新的C99規範支援了可變參數的宏

具體使用如下:

以下内容為程式代碼:

#include  #include

#define LOGSTRINGS(fm, ...) printf(fm,##__VA_ARGS__)

int main() {      LOGSTRINGS("hello, %d ", 10);      return 0; }

但現在似乎隻有gcc才支援。

[轉載]用可變參數宏(variadic macros)傳遞可變參數表

注意:_VA_ARGS__ 從VS2005才開始支援 在 GNU C 中,宏可以接受可變數目的參數,就象函數一樣,例如: #define pr_debug(fmt,arg...) printk(KER ...

c語言中的# ## 可變參數宏 ...和_ _VA_ARGS_ _

1.#假如希望在字元串中包含宏參數,ANSI C允許這樣作,在類函數宏的替換部分,#符号用作一個預處理運算符,它可以把語言符号轉化程字元串.例如,如果x是一個宏參量,那麼#x可以把參數名轉化成相應的字 ...

可變參數宏__VA_ARGS__

在 GNU C 中,宏可以接受可變數目的參數,就象函數一樣,例如:#define pr_debug(fmt,arg...) \printk(KERN_DEBUG fmt,##arg) 用可變參數宏(v ...

嵌入式C語言自我修養 12:有一種宏,叫可變參數宏

12.1 什麼是可變參數宏 在上面的教程中,我們學會了變參函數的定義和使用,基本套路就是使用 va_list.va_start.va_end 等宏,去解析那些可變參數清單我們找到這些參數的存儲位址後, ...

C函數和宏中的可變參數

一:調用慣例 函數的調用方和被調用方對函數如何調用應該有統一的了解,否則函數就無法正确調用.比如foo(int n, int m),調用方如果認為壓棧順序是m,n,而foo認為壓棧順序是n, m,那麼 ...

C# 中的可變參數方法(VarArgs)

首先需要明确一點:這裡提到的可變參數方法,指的是具有 CallingConventions.VarArgs 調用約定的方法,而不是包含 params 參數的方法.可以通過MethodBase.Call ...

Java中的可變參數以及foreach語句

Java中的可變參數的定義格式如下: 傳回值類型  方法名稱(類型 ... 參數名稱){} foreach語句的格式如下: for ( 資料類型  變量名稱 :資料名稱){ ... } public ...

【轉】C,C++中使用可變參數

可變參數即表示參數個數可以變化,可多可少,也表示參數的類型也可以變化,可以是 int,double還可以是char*,類,結構體等等.可變參數是實作printf(),sprintf()等函數的關鍵之處 ...

關于Retrofit網絡請求URL中含有可變參數的處理

開題:在此預設各位看官對Retrofit.以及Okhttp已經有過一定的了解及應用,是以今天我們不談基礎入門的東西,今天我們談在Retrofit請求接口管理類中URL參數含有動态參數的處理方式.一般我 ...

随機推薦

【轉】Android Https伺服器端和用戶端簡單執行個體

轉載位址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps伺服器端和用戶端簡單執行個體 工具介紹 Eclipse3.7 ...

使用簡單NGUI加載進度條

1.在Panel上添加Slider,GNUI--Open--Widget Wizard--Slider,設定Empty和Full 2.在Panel上添加Label,GNUI--Open--Widget ...

QFontMetrics的一個問題

今天發現QFontMetric的一個問題 QFontMetrics可以輸入一個字型和一個字元串,計算出字元串在這種字型下的顯示尺寸. 這種計算比較耗時間,是以Qt内部應該是緩存了計算結果.具體方法是在 ...

.h檔案和.cpp檔案

//建立如圖檔案 //在頭檔案.h中聲明,在.cpp中實作 //main.cpp代碼如下 #define _CRT_SECURE_NO_WARNINGS #include

劍指offer-面試題3.二維數組中的查找

題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增 的順序排序.請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷該數組中是否有該整數. 算法流程如下: 比如一個 ...

【最大流】【HDU3338】【Kakuro Extension】

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=3338 題目大意:填數字,使白色區域的值得和等于有值得黑色區域的相對應的值,用網絡流來做 題目思路:增加 ...

js本地預覽圖檔

廢話不說  直接上代碼