Home > Article > Backend Development > How Can I Achieve Golang-Style Defer in C ?
Understanding Golang-Style Defer in C
Introduction:
In C , the concept of deferred execution, similar to Golang's defer, provides a convenient way to execute code after a specific function returns or exits.
STL and Library Implementations:
As of C 14 and later, the Standard Template Library (STL) or other libraries like Boost do not provide a direct implementation of the deferred execution pattern. However, there are several third-party libraries and techniques available to achieve this functionality.
Custom Implementation:
The provided code snippet offers a zero-overhead, easy-to-use implementation of defer:
<code class="cpp">#ifndef defer struct defer_dummy {}; template <class F> struct deferrer { F f; ~deferrer() { f(); } }; template <class F> deferrer<F> 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</code>
Usage:
To use this implementation, simply place defer before the scope of code you want to execute after the function exits:
<code class="cpp">defer { // Code to be executed after the function returns };</code>
Example:
The following example demonstrates how to use this defer implementation to open and read a file, automatically closing the file when the scope exits:
<code class="cpp">#include <cstdint> #include <cstdio> #include <cstdlib> bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) { ... defer { std::fclose(file); }; // Automatically close the file ... }</code>
Advantages:
This implementation provides several advantages over other approaches:
Conclusion:
This custom defer implementation offers a convenient and efficient way to achieve deferred execution in C , providing a similar functionality to Golang's defer keyword without the need for custom classes or additional dependencies.
The above is the detailed content of How Can I Achieve Golang-Style Defer in C ?. For more information, please follow other related articles on the PHP Chinese website!