Ядро Linux в комментариях


Wait_event - часть 2


Вот почему применяется трюк с do/while(0). Посмотрите на макрос FREE4, свободный от описанных выше проблем:

#define FREE4(p) \ do { \ if (p) \ free(p); \ } while (0)

После помещения макроса в тот же самый код и его разворачивания получается:

if (expression) do { if (p) free(p); } while (0); /* ";" после макроса. */ else printf("expression ложно.\n");

Разумеется, такой код работает корректно. Компилятор выполнит оптимизацию и минимизирует накладные расходы для этого поддельного цикла, поэтому никаких потерь в скорости не будет, а макрос будет работать именно так, как необходимо.

Перед завершением обсуждения данной проблемы нельзя не заметить, что даже несмотря на приемлимость последнего решения, написание функций гораздо лучше написания макросов. Если накладные расходы на вызов функции непозволительны (что имеет место для ядра, но в гораздо меньшей степени для других задач), воспользуйтесь inline-функциями. (Последнее доступно только в компиляторе С++, gcc или в компиляторах, поддерживающих последний стандарт ISO C, где добавлены inline-функции.)




- Начало -  - Назад -  - Вперед -



Книжный магазин