Реализация Defer на C
Концепция defer в стиле Go, которая позволяет выполнять чистую и краткую очистку ресурсов, приобрела популярность в C . Однако найти стандартную или хорошо поддерживаемую реализацию этой функции в библиотеке может быть непросто.
Несмотря на отсутствие встроенной поддержки отсрочки в стандартной библиотеке шаблонов (STL) или Boost, существуют внешние реализации. . Одной из таких реализаций является легкое решение с нулевыми издержками:
#ifndef defer
struct defer_dummy {};
template struct deferrer { F f; ~deferrer() { f(); } };
template deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer
Эта реализация требует минимальной настройки и может быть легко интегрирована в вашу кодовую базу. Синтаксис прост:
defer { statements; };
Например, в следующем фрагменте кода операция fclose автоматически выполняется при выходе из области действия функции read_entire_file:
auto file = std::fopen(filename, "rb");
if (!file)
return false;
defer { std::fclose(file); }; // don't need to write an RAII file wrapper.
// ...
Эта реализация с нулевыми издержками предлагает удобный и эффективный способ управления очисткой ресурсов в C, обеспечивая функцию отсрочки, подобную Go, без необходимости использования сложных классов RAII или пользовательских методов управления памятью.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3