C ++可変パラメータ伝達関数

変数パラメータは、定義された関数は、次のマクロを使用します。

  • 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

おすすめ

転載: www.cnblogs.com/feng9exe/p/11016394.html