c c 可變引數列表

2021-09-27 02:50:44 字數 3492 閱讀 1412

va_list ptr: 定義乙個指向可變引數列表的指標

va_start(ptr, a):初始化指標,其中第二個引數為函式可變引數列表之前的固定引數

va_arg(ptr,int):取出指標指向的元素,第二個引數為元素的型別,返回值為取出的元素,同時指標後移。

va_end(ptr): 還原ptr指標

#include

// 確定:要知道有多少個引數,並且要知道每個引數的型別

void

print

(int a,..

.)intmain()

弊端,必須要知道可變引數的個數和引數型別

_check_return_opt_   

_crt_stdio_inline int __crtdecl printf

( _in_z_ _printf_format_string_ char

const

*const _format,..

.)

va_args:

c99新增的巨集,用來替換巨集定義中的可變引數列表

#define log(format, ...) fprintf(stdout, format, __va_args__)

log(

"%d, %c",2

,'x');

// 2 x

#define log2(x) printf("log2 "#x" %d \n", x);

// #會吧引數轉換成字串

int tmpint =

100;

log2(55

);// log2 55 55

log2

(value)

;// log2 value 100

// ##當可變引數為0時去掉逗號和後面的資料

#define log_type(format, ...) do while(0)

#將變數轉化成字串

##用於巨集中的引數替換, 如 #define test(x) f(a##x) . test3 => f(a3)

#include

#define model_naem "model_name"

#define err_print(fmt, ...) \

printf("[error!] ["model_naem": (fun)%s, (line)%d] " fmt, __func__, __line__, ##__va_args__)

// 注意fmt和前面字串之間的鏈結方式

intmain

(void

)

#include

#include

using namespace std;

// 遞迴結束

template

void

showone

(t t)

template..ts>

void

showone

(t t, ts.

.. ts)

template.. t>

void

show

(t..

. ts)

intmain()

const 引用版本

template

void

displayone

(t t)

template.. ts>

void

displayone

(const t1 &t1,

const ts&..

. ts)

template.. t>

void

display

(const t&..

. ts)

intmain()

右值引用版本

#include

#include

#include

using namespace std;

template

void

print

(t &&t)

template

void

printargs

(t &&arg)

template.. ts>

void

printargs

(t &&arg, ts&&..

. args)

intmain()

#include

#include

#include

#include

using namespace std;

template

void

print

(t &&t)

template.. ts>

void

expand

(ts.

.. ts)

;// 會被展開為

//或者改進為std::initializer_list;

//用lambda表示式實現(gcc4.8.6編譯報錯)

std:

:initializer_list<

int>()

,0).

..};

}int

main()

template .. ts>

class classa;

// 可變引數模板類可以攜帶多個不同的引數

classa<

int>

classa<

int,

char

>

classa<

>

//----------------------------

// 前向宣告

template .. ts>

class classts;

// 特化處理,遞迴終止函式

template

class classts;}

;template .. ts>

class classts>;}

;int

main()

參考:

c++11——可變引數模板

c 語言 define 變參__va_args__使用

#、##、__va_args__和##__va_args__的作用

c++反射機制

c++可變引數模板

備註:之後看了模板再來補充

可變引數列表

模擬實現printf函式 va list是在c語言中解決變參問題的一組巨集,所在標頭檔案 include 用於獲取不確定個數的引數 va start,函式名稱,讀取可變引數的過程其實就是在堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程 va arg,這個巨...

可變引數列表

小二,上 class a public class varargs two param static void twostringparam string a,string b three param 參照上兩種寫法,一直往後面加。是不是感覺很憂傷 幸好這不是真的。string.a static v...

可變引數列表

測試環境 vs2008 1 可變引數列表 為什麼需要可變引數呢?在函式原型中,列出了函式期望接受的引數,原型只能顯示固定數目的引數,如果函式原型列出的引數與可呼叫引數不匹配或數目不一樣,程式將無法執行。例如,我們想要求一系列值的平均值,這裡的一系列的數目是不確定的,如果這些值儲存於陣列中,這個任務就...