変数パラメータは、定義された関数は、次のマクロを使用します。
- va_startマクロ(AP、FARG):最初のパラメータをFARG、可変va_listのAPを初期化します
- va_arg(AP型):パラメータタイプ取得のタイプ(下)
- va_end(AP):最終用途AP
変数パラメータの形式で書かれたC言語では、このように機能します:
#include <stdarg.h>
int sum(int cnt,...) {
int sum = 0;
int i;
va_list ap;
va_start(ap, cnt);
for(i = 0; i < cnt; ++i)
sum += va_arg(ap, int);
va_end(ap);
return sum;
}
変数パラメータは、定義された関数は、次のマクロを使用します。
- va_startマクロ(AP、FARG):最初のパラメータをFARG、可変va_listのAPを初期化します
- va_arg(AP型):パラメータタイプ取得のタイプ(下)
- va_copyの(AP):パラメータリストをコピーするために使用
- va_end(AP):APは使用を終了し
、一般的にこれらのマクロをstdarg.h
そこに。
typedef char * va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
注: 上記のマクロ定義は、異なるシステムによって異なり、異なるプロセッサアーキテクチャが異なります
_INTSIZEOFマクロ
このマクロビットより困難動作意義を理解するために_INTSIZEOFは、一見それは、int型の長さの数は、実際には、整列INTに応じの長さのうち、その操作の結果を表していると思いました。int型が4バイト、_INTSIZEOFされているような(1)、_ INTSIZEOF (2)、_ INTSIZEOF(3)、_ 結果はINTSIZEOF(4)4であり、_INTSIZEOF(5)、_ INTSIZEOF(6)、_ INTSIZEOF(7)、_ INTSIZEOF (8)結果は、パラメータ渡しモードx86アーキテクチャのCPU、32ビット、すなわち4バイト整列されており、8です。
いくつかの注意事項
- それはva_listの、和関数上、このようなCNTパラメータコードを初期化するために使用され、それはまた、渡されたパラメータの数を示すため不定関数のパラメータは、少なくとも一つの固定パラメータを有します。
一般的な方法
変数関数のパラメータ最も一般的に使用されるフォーマット文字列、より一般的なシナリオは、我々はいくつかのログメッセージをエクスポートしたいということですが、コンソールに直接出力することはできません、あなたはログメッセージと出力をフォーマットするログ機能を記述する必要があります。その後、我々はvsprintfの機能を使用することができます。
void log(const char *format, ...) {
char buf[MAX_BUF_SIZE];
va_list ap;
va_start(ap, format);
vsprintf(buf, format, ap);
OUTPUT(buf);
}
最初の2つのパラメータと同じ意味とvsprintfの関数のsprintfの最初の2つのパラメータが、私たちは、独自のフォーマット関数を定義するために使用するものであるパラメータリストのva_listのタイプに置き換え不確実なパラメータの背面。
https://www.cnblogs.com/luzhlon/p/7087080.html