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