Macro terminated with a semicolon

Макроопределение заканчивается точкой с запятой

Описание

Этот дефект происходит, когда макрос, который вызывается, по крайней мере, однажды, имеет определение, заканчивающееся точкой с запятой.

Риск

Если макроопределение заканчивается точкой с запятой, макрорасширение может привести к непреднамеренной логике программы в определенных контекстах, такой как в рамках выражения.

Например, рассмотрите макрос:

#define INC_BY_ONE(x) ++x;
Если используется в выражении:
res = INC_BY_ONE(x)%2;
выражение разрешает:
res = ++x; %2;
Значение x+1 присвоен res, который, вероятно, непреднамерен. Оставшийся автономный оператор %2; допустимый код С и может только быть обнаружен путем включения строгих предупреждений компилятора.

Фиксация

Не заканчивайте макроопределения точкой с запятой. Оставьте его до пользователей макроса, чтобы добавить точку с запятой после макроса при необходимости.

В качестве альтернативы используйте подставляемые функции в предпочтении к подобным функции макросам, которые включают операторы, заканчивающиеся точкой с запятой.

Примеры

развернуть все

#define WHILE_LOOP(n) while(n>0);

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

В этом примере дефект происходит потому что определение макро-WHILE_LOOP(n) концы с точкой с запятой. В результате точки с запятой, while цикл имеет пустое тело и последующие операторы в блоке, запущенном только однажды. Это было, вероятно, предназначено, что цикл должен выполнить итерации 100 раз.

Коррекция – удаляет точку с запятой из макроопределения

Удалите запаздывающую точку с запятой из макроопределения. Пользователи макроса могут добавить точку с запятой после макроса при необходимости. В этом примере не требуется точка с запятой.

#define WHILE_LOOP(n) while(n>0)

void performAction(int timeStep);

void main() {
    int loopIter = 100;
    WHILE_LOOP(loopIter) {
        performAction(loopIter);
        loopIter--;
    }
}

Проверяйте информацию

Группа: Хорошая практика
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: SEMICOLON_TERMINATED_MACRO
Удар: низко

Введенный в R2020a