主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

以分号终止的宏

宏定义以分号结束。

描述

此缺陷发生在调用至少一次的宏定义以分号结尾时。

风险

如果宏定义以分号结尾,宏展开可能在某些上下文中导致意外的程序逻辑,例如在表达式中。

例如,考虑以下宏:

#define INC_BY_ONE(x) ++x;
如果在以下表达式中使用:
res = INC_BY_ONE(x)%2;
该表达式解析为:
res = ++x; %2;
x+1 的值被赋给 res,这可能不是您想要的结果。剩余的独立语句 %2; 是有效的 C 代码,仅在启用严格编译器警告时才能被检测到。

修复

不要在宏定义的末尾使用分号。请让宏的用户在需要时在宏之后添加分号。

或者,优先使用内联函数,而不是涉及以分号结尾的语句的函数式宏。

示例

全部展开

#define WHILE_LOOP(n) while(n>0);

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

在此示例中,出现缺陷的原因是宏 WHILE_LOOP(n) 的定义以分号结束。由于分号的存在,while 循环的体为空,模块中的后续语句只运行一次。很可能是设计时意图让该循环迭代 100 次。

更正 - 删除宏定义中的分号

从宏定义中删除末尾的分号。宏的用户可以在需要时在宏后添加分号。在此示例中,不需要分号。

#define WHILE_LOOP(n) while(n>0)

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

结果信息

组:良好做法
语言:C | C++
默认值:关闭
命令行语法:SEMICOLON_TERMINATED_MACRO
影响

版本历史记录

在 R2020a 中推出