Макрос состоит из нескольких отключенных точкой с запятой операторов, заключенных в фигурные скобки или нет
Этот дефект происходит, когда макрос содержит несколько отключенных точкой с запятой операторов, независимо от того, заключены ли операторы в фигурные скобки.
Макрорасширение, в определенных контекстах, таких как 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