当条件为真时,有没有办法连接宏参数

Is there any way to concatenate macro arguments when condition is true?

本文关键字:连接 参数 有没有 条件      更新时间:2023-10-16

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

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

从头开始,很容易模仿 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所有这些宏。

如果你只是预处理

int main()
{
   int concat_if(1, hello, 0);    //int hello0;
   int concat_if(0, hello, 1);    //int hello;
}

你得到

int main()
{
   int (((1) > 0) ? (hello0) : (hello));
   int (((0) > 0) ? (hello1) : (hello));
}

如您所见,编译器必须处理所有这些令牌。这些行在语法上是无效的,因为条件表达式是表达式。需要可评估。

换句话说,使用条件运算符声明不同名称的变量不是一个可行的策略。

我无法提出任何建议来解决您的问题,因为我不明白真正的问题是什么。此刻感觉像是XY问题。