3

xmlrpc "call" 関数 (可変数のパラメーターを取る) を別の関数 (可変数のパラメーターを取る) でラップしたいと思います。ラッパー関数に渡された可変数のパラメーターを xmlrpc "call" 関数に単純に転送したいと思います。va_start と va_arg の使用方法は知っていますが、渡される値についてはあまり気にしません。単純にそれらをラップされた関数に転送したいだけです。これは可能ですか?

ラップしたい関数の仕様は

call(const char* url, const char* function, const char* paramSpec, void* result, ...);

私のラッパーは最初の 3 つのパラメーターと参照結果を処理します。追加のパラメーターを call 関数に転送するだけです。

4

3 に答える 3

5

...残念ながら、構文を介して可変数の引数を取る関数の完全な転送を提供する方法はありません。これが、すべてのパブリック変数引数リスト関数を、を取り、va_list任意のクライアントコードに両方のインターフェイスを提供する関数の観点から実装することがベストプラクティスである理由です。そのため、標準ライブラリには、、、などがありますprintfvprintfsprintfvsprintf

vcallまたは同様の服用がない場合、va_listあなたが望むことをする簡単な方法はありません。唯一の可能性は、他のパラメーターを解釈して、提供された固定パラメーターに基づいて関数に渡される変数引数リストに含まれている必要があるものを計算し、変数引数リストからすべての引数を別々の変数にプルして、数値の1つを作成することです。call抽出された引数の数とタイプに基づいて、に明示的に呼び出される可能性があります。完全な一般性でこれを行うことはできません。

于 2009-07-24T19:02:11.800 に答える
2

はい、ラップされた関数を制御できる場合は、「...」から va_list に変更してください。例として vprintf を見てください。

(...) を別の (...) でラップできるかどうかわからない

于 2009-07-24T18:53:56.763 に答える
0

これは、一部のプラットフォームでの悪意のあるハッキングによって可能になる場合があります。x86 では、引数は右から左にスタックにプッシュされるため、スタックから戻りアドレスを削除し、追加の引数をプッシュしてから置き換えると、(理論上) 必要なことを行うことができます。難しいのは、ラッパー内からの戻り値で何かをしたいときです...

于 2009-07-24T19:24:33.643 に答える