使用C宏包装函数(带重命名)
我试图使用宏定义一个函数,该宏实际上会将一个现有函数包装成另一个带有前缀的函数。 比如说:使用C宏包装函数(带重命名),c,macros,C,Macros,我试图使用宏定义一个函数,该宏实际上会将一个现有函数包装成另一个带有前缀的函数。 比如说: 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) o
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 <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__)))
扩展至:
inline int p_foo ( float _0 , double _1 ) { return foo( _0 , _1 ); }
如果您费心指定包装函数的返回类型和参数,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__)))
扩展至:
inline int p_foo ( float _0 , double _1 ) { return foo( _0 , _1 ); }
“生成新标题”是什么意思?是否要重定向预处理器的输出以创建头文件?我的意思是,我希望有一个新的头文件,可以包含在所有符号的前缀处。我的问题的上下文部分令人困惑、不及时行乐,因此我删除了它。你所说的“生成新标题”是什么意思?是否要重定向预处理器的输出以创建头文件?我的意思是,我希望有一个新的头文件,可以包含在所有符号的前缀处。我的问题的上下文部分令人困惑、不及时行乐,因此我删除了它。