使用C宏包装函数(使用重命名)

我正在尝试使用宏来定义一个函数,它实际上将现有函数包装到带有前缀的另一个函数中。 比方说吧:

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) 

这应该产生类似的东西:

 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中的任何一个一起使用。 如果有人知道如何做到这一点,我会非常感谢。

如果您可以打扰指定包装函数的返回类型和参数,Boost.Preprocessor可以满足您的要求:

 #include  #include  #include  #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 ); }