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