首页 > 解决方案 > 当条件为真时,有什么方法可以连接宏参数?

问题描述

当条件为真时,我想连接宏参数:

#define concat(x, y) (x##y)
#define concat_if(cond, x, y) (((cond) > 0) ? concat(x, y) : (x))

例如,

int concat_if(1, hello, 0);    //int hello0;
int concat_if(0, hello, 1);    //int hello;

但这会产生编译错误(Clang):

error: use of undeclared identifier 'hello0'
    int concat_if(1, hello, 0);
        ^ note: expanded from macro 'concat_if'
#define concat_if(cond, x, y) (((cond) > 0) ? concat(x, y) : (x))
                                              ^ note: expanded from macro 'concat'
#define concat(x, y) (x##y)
                      ^
<scratch space>:303:1: note: expanded from here
hello0
^
error: use of undeclared identifier 'hello'
    int concat_if(1, hello, 0);
                     ^
2 errors generated.

标签: c++c

解决方案


使用 Boost.PP

#include <boost/preprocessor.hpp>

#define concat_if(cond, x, y) BOOST_PP_IF(cond, BOOST_PP_CAT(x, y), (x))

int concat_if(1, hello, 0);    //int hello0;
int concat_if(0, hello, 1);    //int (hello);

从头开始,很容易模仿 Boost 的功能:

#define concat(x, y) concat_i(x, y)
#define concat_i(x, y) x##y

#define concat_if(cond, x, y) concat(concat_if_, cond)(x, y)
#define concat_if_0(x, y) (x)
#define concat_if_1(x, y) concat(x, y)

int concat_if(1, hello, 0);    //int hello0;
int concat_if(0, hello, 1);    //int (hello);

条件附加到辅助宏前缀,并为任一结果定义单独的宏。请注意,我建议将所有这些宏设为 FULL_UPPERCASE。


推荐阅读