#include
#include
void printlines(char *first,...)
while (str != null );
va_end(v1);
}int main(int argc, char* argv)
函式如何定義可變引數
//eg:
void printlines(char *first,...);
//用三個點來代表可變引數
函式如何接受處理可變引數
使用va_list va_start va_end va_arg
那他們究竟是什麼呢
typedef
char * va_list;
#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end
繼續(我的測試平台:win32,x86,c檔案)
#define _crt_va_start(ap,v) ( ap = (va_list)_addressof(v) + _intsizeof(v) )
#define _crt_va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
#define _crt_va_end(ap) ( ap = (va_list)0 )
#ifdef __cplusplus
#define _addressof(v) ( &reinterpret_cast(v) )
#else
#define _addressof(v) ( &(v) )
#endif
#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
所以 va_list 本質上是 char *,v1儲存的的是引數first的記憶體位址
v1 = (char *)_addressof(first) + _intsizeof(first)
而 va_arg 則可以不斷根據型別向後遍歷變數,因為引數棧本身是不會標明引數個數的,所以我們要在呼叫函式的時候,表明確定引數個數的方法,比如printf中的fmt,或者在函式的第乙個引數處指明引數個數,或者最後乙個變數設定為null等等。
最後使用va_end將指標清空。
C語言可變引數研究
一 何謂可變引數 int printf const char format,這是使用過c語言的人所再熟悉不過的printf函式原型,它的引數中就有固定引數format和可變引數 用 表示 而我們又可以用各種方式來呼叫printf,如 printf d value printf s str print...
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 ...
C語言中可變引數的用法
c語言中可變引數的用法 我們在c語言程式設計中會遇到一些引數個數可變的函式,例如printf 這個函式,它的定義是這樣的 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是 可變的,例如我們可以有以下不同的呼叫方法 printf...