相关疑难解决方法(0)

C/C++宏中的逗号

假设我们有这样的宏

#define FOO(type,name) type name
Run Code Online (Sandbox Code Playgroud)

我们可以使用哪个

FOO(int, int_var);
Run Code Online (Sandbox Code Playgroud)

但并不总是那么简单:

FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Run Code Online (Sandbox Code Playgroud)

我们当然可以这样做:

 typedef std::map<int, int> map_int_int_t;
 FOO(map_int_int_t, map_var); // OK
Run Code Online (Sandbox Code Playgroud)

这不是非常符合人体工程学的.必须处理类型不兼容的问题.知道如何用宏来解决这个问题吗?

c c++ macros c-preprocessor

93
推荐指数
4
解决办法
3万
查看次数

C预处理器递归宏

#define PP_ARG0_(arg0, ...) arg0
#define PP_REST_(arg0, ...) __VA_ARGS__
#define PP_ARG0(args) PP_ARG0_ args
#define PP_REST(args) PP_REST_ args

#define FUNCTION(name) void name();
#define FUNCTION_TABLE(...)                   \
    FUNCTION(PP_ARG0((__VA_ARGS__)))          \
    FUNCTION_TABLE(PP_REST((__VA_ARGS__)))    \
Run Code Online (Sandbox Code Playgroud)

测试代码:

FUNCTION_TABLE(f1, f2,f3,testA,testB,testC);
Run Code Online (Sandbox Code Playgroud)

显然,由于递归扩展,它只会声明void f1(); ,其余的不会扩展:

void f1(); FUNCTION_TABLE(f2,f3,testA,testB,testC);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以使用什么样的技巧来实现递归扩展?问题是我需要支持许多参数(最多100个),我绝对不能使用boost.

c-preprocessor

9
推荐指数
2
解决办法
9732
查看次数

标签 统计

c-preprocessor ×2

c ×1

c++ ×1

macros ×1