C言語における可変パラメータ関数


まず例をあげてから説明する
#include #include int myprintf(char * format, ...) { va_list ap; int int_value = 0; char char_value = ' '; char *str_value = NULL; va_start(ap,format); int_value = va_arg(ap, int); char_value = va_arg(ap, char); str_value = va_arg(ap, char *); printf("%d %c %s %s/n",int_value, char_value , str_value, format); va_end(ap); return 0; } int main() { myprintf("format string ",555,'c', "43234"); return 0; }
上のプログラムはvc 6にあります.0コンパイルパス
可変パラメータの使い方の第一歩:関数宣言functionname(char*format,...)ステップ2:va_を定義するlist変数ap;ステップ3:apをパラメータリストに関連付けるva_start(ap,format); ステップ4:パラメータリストであるformat文字列に従ってパラメータを受信できます.va_の使用arg(ap、パラメータタイプ);
va_argマクロはパラメータタイプに従ってapから順次あなたが入力した変数値を取得します.例ではformatに従ってフォーマットを読み込んでいません.これはあなたの変数に対する理解に影響しないと思います.
プログラムの最後の使用va_end(ap);apを解放する.
原理:(可能な実現方法)
パラメータスタックが前後から上にあると仮定する.すなわちtest(a,b,c,d);先にaをスタックに入れて最後にdを押す.スタックの低いポインタはスタックのトップポインタより小さい.
そこでtypedef char*va_list;
#define va_start(ap,v)  ( ap = (va_list)&v + sizeof(char*)) #define va_arg(ap,t)    ((t *)(ap += sizeof(t))[-1] #define va_end(ap)      ( ap = (va_list)0 )
 
 
さらに、
1、キャッシュsetbuf(stdout,buf)を設定する.2、INT_MAX等マクロはlimitsにあります.hで定義3、ファイルA.cでchar str[]=「test」が定義されている.他のファイルで使用する場合は、次のように宣言します-->extern char str[];またはc++のconst char*str;4、errnoはエラー番号を保存している
以上は理論にすぎず,実際には直接変パラメータ関数を書くことは少なく,いずれも変相呼び出しシステム関数実現である.実装テンプレートは次のとおりです.
	int writeFormat(char* format, ...)
	{

		va_list ap;
		char string[1024];
		va_start(ap,format);
		int size = vsprintf(string,format,ap);
		va_end(ap);

               //                

		return 0;
	
	}