Макрос состоит из нескольких отключенных точкой с запятой операторов, заключенных в фигурные скобки или нет
Этот дефект происходит, когда макрос содержит несколько отключенных точкой с запятой операторов, независимо от того, заключены ли операторы в фигурные скобки.
Макрорасширение, в определенных контекстах, таких как if условие или цикл, может привести к непреднамеренной логике программы.
Например, рассмотрите макрос:
#define RESET(x,y) \ x=0; \ y=0;
if оператор, такой как:if(checkSomeCondition) RESET(x,y);
if(checkSomething) x=0; y=0;
if блок.В макроопределении перенесите несколько операторов в do...while(0) цикл.
Например, в предыдущем примере, используйте определение:
#define RESET(x,y) \
do { \
x=0; \
y=0; \
} while(0)while(0) гарантирует, что операторы выполняются только однажды.В качестве альтернативы используйте подставляемые функции в предпочтении к подобным функции макросам, которые включают несколько операторов.
Обратите внимание на то, что цикл требуется для правильного решения, и перенос операторов в одних только фигурных скобках не устраняет проблему. Макрорасширение может все еще привести к непреднамеренному коду.
| Группа: Хорошая практика |
| Язык: C | C++ |
| Значение по умолчанию: Off |
Синтаксис командной строки:
MULTI_STMT_MACRO |
| Удар: низко |
Find defects (-checkers) | Incorrectly indented statement | Macro terminated with a semicolon | Semicolon on same line as if, for or while statement