2012-02-22 4 views
5

機能はありますか?あなたのコンパイラがvariadic macros多分あなたはそれを使用することをサポートしている場合va_args引数を持つ関数をラップする方法はありますか?</p> <pre><code>void some_function(int id,...); </code></pre> <p><strong>質問</strong>:この機能をラップする方法はあります

void wrapped_some_function(int id,...) 
{ 
    //do smth 
    some_function(id,...); 
} 
+0

http://stackoverflow.com/questions/9329440/process-va-args-in-c([Cにおける可変引数関数の呼び出しを転送]の – BoBTFish

+0

可能重複http://stackoverflow.com/question/150543/forward-a-variadic-function-in-c) – sth

+0

少し違い:私はソース関数を変更することができないように関数をラップする必要があります。そして私は私の答えを得た – 2r2w

答えて

5

gccで、__builtin_apply_args__builtin_applyhere、それを行うことができます。
標準Cの場合、他の答えが示唆するものはありませんが、あなたが求めるものは100%ではありません。
vprintfのようなva_listのバリエーションがsome_functionの場合は、printfのバリエーションです。使用することができます。

+0

素晴らしい。 MS Visual Studioのいくつかの選択肢を指摘できますか? – 2r2w

+0

MSに代わるものがあるかどうかわかりません。ありがとうございます。 – ugoren

1

:それはこのような何かを得ることを意味しますか?

#define wrapped_some_function(id, ...) \ 
    do {         \ 
     /* Do something here... */  \ 
     some_function(id, __VA_ARGS__); \ 
    } while (0) 
+0

ありがとう。しかし、私は機能が必要 – 2r2w

0

私はあなたのラッパー関数は、それ以外の場合は、あなたがちょうどそれらを取得し、包まれた関数を呼び出すことができ、コンパイル時に実際渡される引数の数(およびそのタイプ)を「知らない」と仮定します。

これは、インラインアセンブラ(したがって、プラットフォーム依存のソリューション)を使用することによってのみ解決できます。これは、関数をどのくらい正確にラップしたいのか、ラッパーのスタックを確保する必要があるか(つまり、ローカル関数変数は必要ない)などによって異なります。

0

一般的に、some_functionの作成者が... ...を取る方法がないので、それを行う方法はありませんが、va_listです。可変引数リストを持つ関数のカウンタ部分は、va_listの関数でなければなりません。関数のペア(printf、vprintf)、(sprintf、vsprintf)、(CString :: Format、CString :: FormatV)を考えてみましょう。

4

これはタグが付いているので、C++:C++ 11 ftwです。

#include <utility> // forward 

template<class... Args> 
void wrapped_some_function(int id, Args&&... args) 
{ 
    //do smth 
    some_function(id, std::forward<Args>(args)...); 
} 
+0

面白い。私は必要なものではありません。私はC関数が必要です – 2r2w

+0

@ 2r4w:申し訳ありませんが、C++にタグを付けません。 – Xeo

+0

間違ったタグを削除しました。しかしあなたの答えは役に立ちました – 2r2w

関連する問題