c語言中關於可變引數的研究

2021-07-25 19:32:05 字數 1332 閱讀 6167

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