如何获取在预处理器中使用的 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
,后者推导出参数的类型。无需知道参数的原始名称,它适用于任何类型。
我使用宏来声明函数,例如:
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
,后者推导出参数的类型。无需知道参数的原始名称,它适用于任何类型。