Определение макроса заканчивается точкой с запятой
Этот дефект возникает, когда макрос, вызываемый хотя бы один раз, имеет определение, оканчивающееся точкой с запятой.
Если определение макроса заканчивается точкой с запятой, расширение макроса может привести к непреднамеренной программной логике в определенных контекстах, например в выражении.
Например, рассмотрим макрос:
#define INC_BY_ONE(x) ++x;
res = INC_BY_ONE(x)%2;
res = ++x; %2;
x+1 присвоен res, что, вероятно, непреднамеренно. Автономная инструкция leftover %2; является допустимым кодом C и может быть обнаружен только путем включения строгих предупреждений компилятора.Не завершайте определения макросов точкой с запятой. При необходимости оставьте за пользователями макроса точку с запятой после макроса.
Кроме того, вместо функциональных макросов, содержащих инструкции, заканчивающиеся точкой с запятой, можно использовать встроенные функции.
| Группа: Надлежащая практика |
| Язык: C | C++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
SEMICOLON_TERMINATED_MACRO |
| Воздействие: Низкий |
Find defects (-checkers) | Incorrectly indented statement | Macro with multiple statements | Semicolon on same line as if, for or while statement