当条件为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.
答案 0 :(得分:4)
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。