我想要这个:
typedef int (*PTR_FUN)(int);
typedef int (*PTR_FUN_FUN)(PTR_FUN, PTR_FUN);并将其定义如下:
MAKE_FUNCTION_TYPE(PTR_FUN, int, int);
MAKE_FUNCTION_TYPE(PTR_FUN_FUN, PTR_FUN, PTR_FUN, int);...where参数的数量是动态的,最后一个参数是返回类型。
如果不可能将最后一个arg作为返回类型,则作为第二个arg。
发布于 2019-11-26 22:24:03
您需要的是一个变量宏,它可以接受任意数量的参数。语法是#define MACRO(fixedarg1, fixedarg2, ...)。在宏的正文中,只需使用__VA_ARGS__引用所有变量参数。
不幸的是,您不能使最后一个arg返回类型,因为您必须统一处理整个变量块,它们必须是最后一个。但是,您可以很容易地将第二个arg设置为返回类型:
#define MAKE_FUNCTION_TYPE(name, ret, ...) typedef ret (*name)(__VA_ARGS__)
MAKE_FUNCTION_TYPE(v_i, int);
MAKE_FUNCTION_TYPE(i_v, void, int);
MAKE_FUNCTION_TYPE(ii_cp, char *, int, int);这相当于
typedef int (*v_i)();
typedef void (*i_v)(int);
typedef char * (*ii_cp)(int, int);您可以使用cc -E进行检查。
发布于 2019-11-26 23:48:32
如果您真的希望返回类型是最后一个,这是很复杂的,但是Boost.Preprocessor (它同时适用于C和C++)可以帮助实现它:
#include <boost/preprocessor/tuple.hpp>
#include <boost/preprocessor/variadic.hpp>
#include <boost/preprocessor/control/if.hpp>
#include <boost/preprocessor/comparison/greater.hpp>
#define PP_VARIADIC_BACK(...) \
BOOST_PP_TUPLE_ELEM(BOOST_PP_DEC(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)), \
BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))
#define PP_VARIADIC_POP_BACK(...) \
BOOST_PP_IF(BOOST_PP_GREATER(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 1), \
BOOST_PP_TUPLE_POP_BACK(BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)), \
(void))
#define MAKE_FUNCTION_TYPE(name, ...) \
typedef PP_VARIADIC_BACK(__VA_ARGS__) (*name) PP_VARIADIC_POP_BACK(__VA_ARGS__)助手宏PP_VARIADIC_BACK至少需要一个参数并在最后一个参数中得到结果。助手宏PP_VARIADIC_POP_BACK至少需要一个参数。当它得到多个参数时,它会生成括号,其中包含除最后一个参数之外的所有参数的逗号分隔列表。当它得到一个参数时,它会产生文本(void)。
然后,这些就可以与typedef和(*name)部件放在一起了。由于您的示例使用的是在宏后面提供分号,所以最后一个分号被中断。
在coliru上的示例预处理器输出。
https://stackoverflow.com/questions/59059848
复制相似问题