可変関数、可変パラメータ


可変パラメータvariableparentの処理
  • 変数を受け入れる関数を作成します.
    int ft_printf(const char *c, ...);
    int sum(int count, ...);
    パラメータの",..."部分的に可変因子を受け入れます.
    .
  • va_list可変パラメータポインタを格納する構造体va_list ap; (argument pointer)
  • apを宣言し、apを別の関数に渡すとvoid test(va_list *ap);パラメータをポインタに設定します.test(&ap);アドレスに移動
    vaリストapで交換するだけで、エラーを探すためにうろうろします.
    .
  • void va_start(va_list ap, last);apを最初の可変パラメータアドレスに変更します.
    Last=前の固定パラメータ
    ex) va_start(ap, c);.
  • type va_arg(va_list ap, type);タイプに応じてapを読み出し、次の可変パラメータ位置に移動します.
  • gcc規格cによれば、資料型がintより小さい場合はint、floatまたはdoubleを用いて読み取る.
    char, bool, short -> int
    float -> double
    例外として、visualstdioでcharを読み込む場合にのみ、charを直接読み込むことができます.
    https://dojang.io/mod/page/view.php?id=578
    .
  • void va_copy(va_list dest, va_list src);srcをdestにコピー(va startに初期化されていません)
    va start()で初期化し、va arg()でアクセスし、va end()で終わり、コピーも同様のプロセスを経験します.
    まだ使ったことがありません.
    .
  • void va_end(va_list ap);1つの関数では、va startで始まり、va endで終わるべきです.
    //なぜ1つの関数で発生するのですか?apを他の関数に渡すと影響を受けますか?
    .
  • リファレンスリンク
    man 3 stdarg - https://linux.die.net/man/3/stdarg
    https://dojang.io/mod/page/view.php?id=578
    https://norux.me/19
    https://jangsalt.tistory.com/entry/可変ファクタ-vamart-vaend-vaarg-valist