16

戻り値の型が va_list の関数を書きたいと思います。

例:va_list MyFunc(va_list args);

これは安全で持ち運び可能ですか?

4

4 に答える 4

7

va_list 配列型である可能性がありますが (保証されていません)、値で渡したり返したりすることはできません。そのように見えるコードは、最初の要素へのポインターを渡したり返したりするだけかもしれないので、呼び出し先でパラメーターを使用できますが、元の要素を操作している可能性があります。

va_list正式には、値型ではなくエンティティ型であると言えるでしょう。va_copy割り当てや関数パラメーター/リターンではなく、でコピーします。

于 2012-05-18T07:45:26.140 に答える
1

言語標準が何を言おうとも、これが実際に機能する可能性は低いです。Ava_listは、呼び出し先の利益のために呼び出し元によってスタックに配置された呼び出しレコードへのポインターである可能性があります。呼び出し先が戻ったら、スタック上のそのメモリは再利用のための公正なゲームです。

タイプva_listを返すことで、リストの内容が実際に呼び出し元にコピーされる可能性はほとんどありません。これはCの有効な実装ですが、標準で必要な場合は、仕様に欠陥があります。

于 2012-05-18T11:40:21.193 に答える
1

確かにreturnそのような値を使用できますが、戻り値を有用な方法で使用できるかどうかはわかりません。

s の処理にva_listは特別な処理 ( and のva_end()va_start()に必要va_copy())が必要であり、このペアリングを強制するためva_start/copyva_endマクロを含めることさえ許可されている{ }ため、一方を他方なしで呼び出すことはできません。

于 2012-05-18T07:31:29.753 に答える
0

ただし、別の関数にポインターを渡すことは、そのポインターを返すこととはまったく異なります。多く/ほとんどの実装では、vararg 関数が戻るときに破棄されるスタック フレームに実際の変数引数を格納します。(つまり、va_list または 1 つへのポインターを返すと、破棄されたローカル変数へのポインターが残ります)。– いいえ

私の場合は va_list を返しますが、警告してくれてありがとう – Hayri Uğur Koltuk

va_list関数に a へのポインターを渡す場合、元のリストを変更するため、変更された ( によって) 引数リストを返すMyFunc(va_list *args)必要はありません。va_arg(*args, type)MyFunc

于 2017-09-18T08:30:04.213 に答える