2017-11-03 15 views
0

実際に既存の関数を接頭辞付きで他の関数にラップするマクロを使用して関数を定義しようとしています。 のは、例えばましょう:Cマクロを使用した関数の折り返し(名前の変更)

int a_f1(int a, void *b, char c); 
int a_f1(int a, void *b, char c) { return f1(a,b,c); } 

私はそれがF1、F2、F3やF4のいずれかで動作することができるようにそれをやろうとしている:

int f1(int a, void *b, char c) { return 1; } 
int f2(void *a) { return 1; } 
void f3(void *a, int b) {} 
void f4() {} 

#define WRAP(prefix, f) // do something 
WRAP(a, f1) or WRAP(a,f1,int,void*,char) or WRAP(a,f1,int,a,void*,b,char,c) 

これは、のようなものを作る必要があります。 誰かがそれを行う方法について考えているなら、私は本当に感謝します。あなたがラップ機能の戻り値の型とパラメータを指定するために気にすることができれば

+0

「新しいヘッダーを生成する」とはどういう意味ですか?プリプロセッサの出力をリダイレクトしてヘッダファイルを作成しようとしていますか? –

+0

私は、すべてのシンボルがプレフィックスされている場所を含めることができる新しいヘッダーを作成したいと考えています。私の質問のコンテキスト部分は混乱していて、不十分で不必要なので、削除しました。 – yayg

答えて

3

は、Boost.Preprocessorはあなたがカバーしている:あなたは、以下の書き込みができます

#include <boost/preprocessor/tuple/to_seq.hpp> 
#include <boost/preprocessor/seq/for_each_i.hpp> 
#include <boost/preprocessor/comma_if.hpp> 

#define WRAP_declare_param(r, data, i, paramType) \ 
    BOOST_PP_COMMA_IF(i) paramType _ ## i 

#define WRAP_forward_param(r, data, i, paramType) \ 
    BOOST_PP_COMMA_IF(i) _ ## i 

#define WRAP_seq(prefix, retType, function, argSeq) \ 
    inline retType prefix ## function (\ 
     BOOST_PP_SEQ_FOR_EACH_I(WRAP_declare_param, ~, argSeq) \ 
    ) { \ 
     return function(\ 
      BOOST_PP_SEQ_FOR_EACH_I(WRAP_forward_param, ~, argSeq) \ 
     ); \ 
    } 

#define WRAP(prefix, retType, function, ...) \ 
    WRAP_seq(prefix, retType, function, BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))) 

// Declared somewhere... 
int foo(float, double); 

WRAP(p_, int, foo, float, double) 
// ^^       Prefix 
//  ^^^      Return type 
//   ^^^    Function 
//     ^^^^^^^^^^^^^ Parameter types 

をどの次のように展開されます:

inline int p_foo (float _0 , double _1) { return foo(_0 , _1); } 
関連する問題