寫**之前要先介紹一下可變引數的備用知識;
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哦,原來第乙個引數可以是int型別的;這下了解了第乙個函式的用處了吧@!void myprintf_two(int
format, ...)
215 printf("
format is %d\n
",format);
16va_end(argp);
1718 }
在用可變引數函式的時候需要注意一點,就是在獲取float型別的時候一定要用double接收;來看個函式:
1如果把va_arg(argp,double)改成:va_arg(argp,float)就會報錯了:double add(int
n, ...)
2
就這麼多吧,附上完整的**:
1 #include 2 #includeview code3 #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
利用 vsnprintf 配合 va_list 操作傳遞進來的引數:
#include #includeint 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...