我想检查一下如果多次,我使用#define这个广告我想使用它但它不起作用
#define CHECK_CONDITION(QString condition, start, curr) if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())
我这样使用它:
if(CHECK_CONDITION(table.commonIn().toStdString(), start, start-idx);) {
findFalse = true;
}
我如何在我的代码中使用此定义/ 提前谢谢你
答案 0 :(得分:2)
预处理器没有类型的概念,因此当您使用类型声明#define
时,您不需要指定参数类型:
#define CHECK_CONDITION(condition, start, curr) { if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())}
此外,#define
在您使用它的地方展开(预处理器用该代码块替换 CHECK_CONDITION
),因此您的代码将无法编译,因为at至少一个原因:您将在if
条件中嵌套if
,这是语法错误。
使用(也许是内联)功能,而不是:
inline
bool check_condition(QString condition, int start, int curr) {
if(condition == "" ) return true;
return (
table.commonIn() == "team_id"?
list()[start]->team() == list()[curr]->team():
list()[start]->team() == list()[curr]->team()
)
}
这也明确了一个可能的语法错误:我不知道你对最后两行的意思,所以我没有触及......
My 2cents:你应该在C ++中看到预处理器作为最后的手段:你有模板,const变量和内联函数。
它留在C ++中的主要原因(而不是单独使用include
关键字等)是为了保持与C的向后兼容性。切勿使用预处理器,除非任何其他解决方案过于复杂
答案 1 :(得分:1)
C / C ++中的#define
是一个宏定义,是一个简单的文本替换。此定义更像是一个函数,并尝试将类型分配给其中一个参数。这不是合法语法,因此需要删除QString
部分
总的来说,这段代码并不适合宏。参数start
和curr
在扩展中都被多次使用。这意味着如果将副作用表达式传递给宏,它将被执行多次。一个函数在这里更合适
答案 2 :(得分:1)
您可以使用此修改过的宏:
#define CHECK_CONDITION(condition, start, curr) \
if(condition == "" || (condition == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())
你在这个宏中犯了错误:
为条件指定QString
返回因为那将不具有“宏的返回值”的逻辑,但实际上将在outter函数中返回。那是因为它必须经过预处理器步骤。
您不需要在宏中使用单独的分支,因为简单的逻辑OR(“||”)可以执行此操作。
即使您已经传递了条件变量,也使用了宏中字符串getter中常用的表。
我会使用反斜杠将它拆分成碎片以提高可读性。
然后您可以保留其余代码:
if(CHECK_CONDITION(table.commonIn(), start, (start-idx))) {
findFalse = true;
}
你犯的错误是:
你在if条件中有一个不必要的分号,这是一个无效的C ++语法。
你可能会因为没有将减法放入括号而陷入麻烦(不是这里)。
如果您可以在CHECK_CONDITION宏调用之前为字符串和当前整数创建两个单独的变量,将会更清晰。如下所示。
您正在传递std :: string而不是QString。
但如果你能简单地将第二部分像这样:
,那就更好了QString myString = table.commonIn();
int curr = start - idx;
if(CHECK_CONDITION(myString, start, curr)) {
findFalse = true;
}
免责声明:我一直在尝试让您的宏及其调用者正常工作,但一般情况下尽量避免使用宏。
有些情况下它们有意义,但有一些替代方法,如模板(此处不适用)或内联函数和方法(不确定是否适用于此处)。根据您的使用情况,您可以选择您喜欢的任何一种,但是您可以明白如何使宏适用于您的用例。