如何获取在预处理器中使用的 unsecable "int toto" 类型

How to get the type of unsecable "int toto" for use in preprocessor

我使用宏来声明函数,例如:

NATIVE(int, myfunctionname, int param1, int param2)
NATIVE(int, myfunctionname, int param1, int)

'NATIVE' 宏负责生成包装器,例如:

int myfunctionname(int arg0, int arg1) {
   return mystruct.myfunctionname(arg0, arg1);
}

由于某些特定原因,我无法使用 LD_PRELOAD 或 ld --wrap 命令。

我现在遇到的主要问题是在预处理器标记为 "int" 或 "int param0" 时能够在编译时检索类型 "int"。

编辑:我希望能够同时使用两者:

NATIVE(int, myfunctionname, int param1, int param2)
NATIVE(int, myfunctionname, int, int)

但只有后者有效。正如评论中所问,这里有更多的上下文:

#define c99_count(...)    _c99_count1 (, ## __VA_ARGS__) /* If only ## worked.*/
#define _c99_count1(...)  _c99_count2 (__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
#define _c99_count2(_,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,n,...) n

#define FULL_ARGS_0()
#define FULL_ARGS_1(X0)  X0 a0
#define FULL_ARGS_2(X0,X1)  X0 a0, X1 a1
#define FULL_ARGS_3(X0,X1,X2)  X0 a0, X1 a1, X2 a2
#define FULL_ARGS_4(X0,X1,X2,X3)  X0 a0, X1 a1, X2 a2, X3 a3
#define FULL_ARGS_5(X0,X1,X2,X3,X4)  X0 a0, X1 a1, X2 a2, X3 a3, X4 a4

#define _ARGS_0()
#define _ARGS_1(X0)  a0
#define _ARGS_2(X0,X1)   a0, a1
#define _ARGS_3(X0,X1,X2)  a0, a1, a2
#define _ARGS_4(X0,X1,X2,X3)  a0, a1, a2, a3
#define _ARGS_5(X0,X1,X2,X3,X4) a0, a1, a2, a3, a4

#define CAT(a, ...) PRIMITIVE_CAT (a, __VA_ARGS__)
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__

/*
 gives a name X0 a0
 */
#define  FULL_ARGS(...) CAT ( FULL_ARGS_, c99_count (__VA_ARGS__) ) (__VA_ARGS__)
#define  ARGS(...) CAT (_ARGS_,c99_count (__VA_ARGS__)) (__VA_ARGS__)

#define NATIVE(rtype, name,...)                                    \
  rtype name (FULL_ARGS(__VA_ARGS__)) \
  {                                                             \
    return (*g_libc.name ## _fn) (ARGS (__VA_ARGS__));              \
  }
namespace detail_paramType {
    template <class>
    struct unpackType;

    template <class T>
    struct unpackType<void(T)> { using type = T; };
}

#define PARAM_TYPE(...) \
    typename detail_paramType::unpackType<void(__VA_ARGS__)>::type

这有点棘手。 using type = void (*param)(); 之类的语法无法编译,因为该类型不包含名称。

变量声明语法是兼容的,但我们离目标还很远,因为我们不知道参数的名称:

void (*param)(); // Fine
using type = decltype(???); // Now what ? We can't name param...

但是,函数类型参数的语法中允许(并忽略)名称。所以 PARAM_TYPE 将其参数填充到函数类型中,并将其传递给 unpackType,后者推导出参数的类型。无需知道参数的原始名称,它适用于任何类型。

Live on Coliru