簡體   English   中英

使用C宏包裝函數(帶有重命名)

[英]Wrapping functions using C macros (with renaming)

我正在嘗試使用宏定義一個函數,該宏實際上會將現有函數包裝到帶有前綴的另一個函數中。 舉例來說:

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__)))

通過它可以編寫以下內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM