gpt4 book ai didi

c++ - 当条件为真时,有什么方法可以连接宏参数吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:04 24 4
gpt4 key购买 nike

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

#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.

最佳答案

With 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);

From scratch ,很容易模拟 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。

关于c++ - 当条件为真时,有什么方法可以连接宏参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com