C 可變引數

2022-03-31 05:42:01 字數 2027 閱讀 1600

寫**之前要先介紹一下可變引數的備用知識; 

c函式要在程式中用到以下這些巨集:

void va_start( va_list arg_ptr, prev_param ); 

type va_arg( va_list arg_ptr, type ); 

void va_end( va_list arg_ptr );

va在這裡是variable-argument(可變引數)的意思.   

這些巨集定義在stdarg.h中,所以用到可變引數的程式應該包含這個標頭檔案.下面我們寫乙個簡單的可變引數的函式,改函式至少有乙個整數引數,第二個引數也是整數,是可選的.函式只是列印這兩個引數的值.

了解了這些知識之後就可以寫下我們的第乙個可變引數的函式了;

1

void myprintf(const

char *format, ...)

217 printf("

format is %s\n

",format);

18 va_end(argp); //

將argp置為null

19 }

需要注意的是

函式定義的時候第二個引數必須是三個.;

必須用va_start巨集初始化argp;

用完之後必須用va_end巨集將argp置空;

此函式的呼叫方法是: myprintf("printf","this","is","a","text","!","\0");//取\0為結束符 我們需要用乙個字元'\0'來確定是否是最後乙個字元;

此函式是從第二個引數來輸出的;那麼第乙個引數是用來幹什麼的呢?貌似第乙個函式除了初始化的時候用到了,其他的時候都沒有用到。我們再寫乙個函式來看看第乙個引數的用處:

1

void myprintf_two(int

format, ...)

215 printf("

format is %d\n

",format);

16va_end(argp);

1718 }

哦,原來第乙個引數可以是int型別的;這下了解了第乙個函式的用處了吧@!

在用可變引數函式的時候需要注意一點,就是在獲取float型別的時候一定要用double接收;來看個函式:

1

double add(int

n, ...)

2

如果把va_arg(argp,double)改成:va_arg(argp,float)就會報錯了:

就這麼多吧,附上完整的**:

1 #include 2 #include 

3 #include 4

5void myprintf(const

char *format, ...)

621 printf("

format is %s\n

",format);

22 va_end(argp); //

將argp置為null23}

2425

void myprintf_two(int

format, ...)

2639 printf("

format is %d\n

",format);

40va_end(argp);

4142}43

44double add(int

n, ...)

4554

55int main(void)56

view code

利用 vsnprintf 配合 va_list 操作傳遞進來的引數:

#include #include 

int mon_log(char*format, ...)

//呼叫上面的函式

void

main() 

C 可變引數

include c 對於函式支援可變形參,它通過 來表示未知個數的形參,通過va 系列函式進行操作。va list是乙個巨集,由va start和va end界定。typedef char va list void va start va list ap,prev param type va arg...

C 可變引數

1.概念 常用如printf函式 它的引數並不是固定個數的,而在呼叫時根據情況確定 2.c中的實現 用到了 va list 每次指向乙個可變的引數 va start 初始化va list變數,使其指向第乙個可變引數 va end 清理 3.書上的兩個簡單例子 1 int print arg int ...

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