条件为真时,是否有任何方法可以连接宏参数?

时间:2019-04-11 02:40:04

标签: c++ c

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

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

2 个答案:

答案 0 :(得分:4)

With Boost.PP

tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract'

From scratch,可以很容易地模拟Boost的功能:

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

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

答案 1 :(得分:0)

如果您只是预处理

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 Problem