本文主要介紹va_start和va_end的使用及原理。html
在之前的一篇帖子Format MessageBox 詳解中曾使用到va_start和va_end這兩個宏,但對它們也只是泛泛的瞭解。ios
介紹這兩個宏以前先看一下C中傳遞函數的參數時的用法和原理: 數據結構
1.在C中,當咱們沒法列出傳遞函數的全部實參的類型和數目時,能夠用省略號指定參數表函數
2.函數參數的傳遞原理指針
函數參數是以數據結構:棧的形式存取,從右至左入棧。orm
typedef char* va_list; void va_start ( va_list ap, prev_param ); /* ANSI version */ type va_arg ( va_list ap, type ); void va_end ( va_list ap );
#include <iostream.h> void fun(int a, ...) { int *temp = &a; temp++; for (int i = 0; i < a; ++i) { cout << *temp << endl; temp++; } } int main() { int a = 1; int b = 2; int c = 3; int d = 4; fun(4, a, b, c, d); system("pause"); return 0; }
Output::
1
2
3
4htm
void TestFun(char* pszDest, int DestLen, const char* pszFormat, ...) { va_list args; va_start(args, pszFormat); //必定要「...」以前的那個參數 _vsnprintf(pszDest, DestLen, pszFormat, args); va_end(args); }
#include 〈stdio.h〉 #include 〈string.h〉 #include 〈stdarg.h〉 /*函數原型聲明,至少須要一個肯定的參數,注意括號內的省略號*/ int demo( char, ... ); void main( void ) { demo("DEMO", "This", "is", "a", "demo!", ""); } /*ANSI標準形式的聲明方式,括號內的省略號表示可選參數*/ int demo( char msg, ... ) { /*定義保存函數參數的結構*/ va_list argp; int argno = 0; char para; /*argp指向傳入的第一個可選參數,msg是最後一個肯定的參數*/ va_start( argp, msg ); while (1) { para = va_arg( argp, char); if ( strcmp( para, "") == 0 ) break; printf("Parameter #%d is: %s\n", argno, para); argno++; } va_end( argp ); /*將argp置爲NULL*/ return 0; }
以上是對va_start和va_end的介紹。blog
轉載於:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html內存