戻り値の型が va_list の関数を書きたいと思います。
例:va_list MyFunc(va_list args);
これは安全で持ち運び可能ですか?
戻り値の型が va_list の関数を書きたいと思います。
例:va_list MyFunc(va_list args);
これは安全で持ち運び可能ですか?
va_list
配列型である可能性がありますが (保証されていません)、値で渡したり返したりすることはできません。そのように見えるコードは、最初の要素へのポインターを渡したり返したりするだけかもしれないので、呼び出し先でパラメーターを使用できますが、元の要素を操作している可能性があります。
va_list
正式には、値型ではなくエンティティ型であると言えるでしょう。va_copy
割り当てや関数パラメーター/リターンではなく、でコピーします。
言語標準が何を言おうとも、これが実際に機能する可能性は低いです。Ava_list
は、呼び出し先の利益のために呼び出し元によってスタックに配置された呼び出しレコードへのポインターである可能性があります。呼び出し先が戻ったら、スタック上のそのメモリは再利用のための公正なゲームです。
タイプva_list
を返すことで、リストの内容が実際に呼び出し元にコピーされる可能性はほとんどありません。これはCの有効な実装ですが、標準で必要な場合は、仕様に欠陥があります。
確かにreturn
そのような値を使用できますが、戻り値を有用な方法で使用できるかどうかはわかりません。
s の処理にva_list
は特別な処理 ( and のva_end()
後va_start()
に必要va_copy()
)が必要であり、このペアリングを強制するためva_start/copy
にva_end
マクロを含めることさえ許可されている{ }
ため、一方を他方なしで呼び出すことはできません。
ただし、別の関数にポインターを渡すことは、そのポインターを返すこととはまったく異なります。多く/ほとんどの実装では、vararg 関数が戻るときに破棄されるスタック フレームに実際の変数引数を格納します。(つまり、va_list または 1 つへのポインターを返すと、破棄されたローカル変数へのポインターが残ります)。– いいえ
私の場合は va_list を返しますが、警告してくれてありがとう – Hayri Uğur Koltuk
va_list
関数に a へのポインターを渡す場合、元のリストを変更するため、変更された ( によって) 引数リストを返すMyFunc(va_list *args)
必要はありません。va_arg(*args, type)
MyFunc