Макрос состоит из нескольких операторов с точкой с запятой, заключенных в фигурные скобки или нет
Этот дефект возникает, когда макрос содержит несколько операторов, завершенных точкой с запятой, независимо от того, заключены ли операторы в фигурные скобки.
Расширение макроса в определенных контекстах, таких как 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++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
MULTI_STMT_MACRO |
| Воздействие: Низкий |
Find defects (-checkers) | Incorrectly indented statement | Macro terminated with a semicolon | Semicolon on same line as if, for or while statement