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