【问题标题】:Wrapping functions using C macros (with renaming)使用 C 宏包装函数(带重命名)
【发布时间】:2017-11-03 00:47:26
【问题描述】:

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

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

【问题讨论】:

  • “生成新的标头”是什么意思?您是否打算重定向预处理器的输出以创建头文件?
  • 我的意思是我想要一个新的标题,我可以在所有符号的前缀位置包含它。我的问题的上下文部分令人困惑、不准确且不准确,因此我将其删除。

标签: c macros


【解决方案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__)))

这让您可以编写以下内容:

// 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 ); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多