size
を使用する必要があります fmt
の代わりに :
va_start(args, size);
size
です 、fmt
ではありません 、これは明示的な名前を持つ最後のパラメーターです (名前のない vararg パラメーターとは対照的に)。最後に名前を付けたパラメーターを va_start
に渡す必要があります vararg パラメータが開始するメモリ内のアドレスを把握するためです。
second parameter of ‘va_start’ not last named argument
意味と削除方法は?
関数の名前はパラメーター parent
です 、 fmt
そして size
. C 仕様では、最後に名前を付けたパラメーターを常に va_start
に渡す必要があると書かれています 、古いコンパイラとの互換性のため。したがって、size
を渡す必要があります 、 fmt
ではありません .
(しかし、最新のコンパイラでは、とにかく動作する可能性があります)
ここには混乱があると思います。ほとんどの人は、フォーマットと可変引数を持つ prinf のような関数のみを扱います。彼らは、フォーマットを記述するパラメータ名を渡す必要があると考えています。ただし、va_start は printf のような形式とは何の関係もありません。これは、名前のないパラメーターが開始するスタック上のオフセットを計算する単なる関数です。