用cpp中的#define定义函数?

时间:2014-01-11 12:40:08

标签: c++ qt macros qstring qtcore

我想检查一下如果多次,我使用#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;
}

我如何在我的代码中使用此定义/ 提前谢谢你

3 个答案:

答案 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部分

总的来说,这段代码并不适合宏。参数startcurr在扩展中都被多次使用。这意味着如果将副作用表达式传递给宏,它将被执行多次。一个函数在这里更合适

答案 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;
}

免责声明:我一直在尝试让您的宏及其调用者正常工作,但一般情况下尽量避免使用宏。

有些情况下它们有意义,但有一些替代方法,如模板(此处不适用)或内联函数和方法(不确定是否适用于此处)。根据您的使用情况,您可以选择您喜欢的任何一种,但是您可以明白如何使宏适用于您的用例。