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