Pull to refresh
9
0
Александр Куренев @AlexanderKurenev

C++ developer

Send message

Мы сейчас работаем над версией плагина для Qt Creator 9.0.x. Выдадим вам бету и скажем, что с ней делать, как будет готова.

На данный момент только для версии Qt Creator 8.0.x. А вы какую версию используете?

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

Еще такая конструкция может использоваться для объединения нескольких конструкций в одну в макросах.

Пояснение (TL;DR;)
#define FreeMemoryAndExit(p) free((p)); return
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
FreeMemoryAndExit(ptr);
// Чудесный код продолжается
}

После макроподстановки получим следующий код:

#define FreeMemoryAndExit(p) free((p)); return
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
free((ptr)); return;
// Чудесный код продолжается
}

В итоге чудесный код никогда не выполняется, return всегда безусловный. Теперь воспользуемся do { .... } while (false):

#define FreeMemoryAndExit(p) do { free((p)); return; } while (false)
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
FreeMemoryAndExit(ptr);
// Чудесный код продолжается
}

И вот что получим после препроцессора:

#define FreeMemoryAndExit(p) do { free((p)); return; } while (false)
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
do { free((ptr)); return; } while (false);
// Чудесный код продолжается
}

Теперь освобождение и выход зависят от условия. Чудесный код продолжается. Подобного можно было добиться и просто оборачиванием в фигурные скобки. Но у do { .... } while (false) и здесь есть преимущество - если кто-то допишет ветку else после макроса, то ничего не сломается.

Согласен, спасибо за ваш комментарий. Поправил код в статье.

Прямо сейчас - нет. Но может быть Inori доработает таки свой эмулятор. Шансы есть, подождём лет 5-10))

Согласен с Вами, что в функцию free можно передавать нулевой указатель. Цитирую из статьи: "Заметим, что сам по себе вызов функции free на нулевом указателе не является ошибкой."

Предупреждение PVS-Studio V575 прежде всего про то, что в функцию free странно передавать нулевой указатель. Возможно, указатель занулили до вызова free и получили утечку памяти. Может быть, опечатались в названии переменной, и хотели освободить память по другому адресу.

Спасибо за предложение, посмотрим.

Information

Rating
Does not participate
Date of birth
Registered
Activity