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