// Requres GCC or Clang with `-fblocks` option available. // #ifndef KIT_DEFER_H #define KIT_DEFER_H #if !defined(__clang__) && !defined(__APPLE__) # error C blocks support required #endif #ifdef __cplusplus extern "C" { #endif #if defined(__GNUC__) || defined(__clang__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-function" # pragma GCC diagnostic ignored "-Wunknown-pragmas" #endif static void kit_defer_cleanup_(void (^*b)(void)) { (*b)(); } #define kit_defer_merge_(a,b) a##b #define kit_defer_varname_(a) \ kit_defer_merge_(kit_defer_scopevar_,a) #define defer \ __attribute__((unused, cleanup(kit_defer_cleanup_))) \ void (^kit_defer_varname_(__COUNTER__))(void) = ^ #define defer_ref __block #if defined(__GNUC__) || defined(__clang__) # pragma GCC diagnostic pop #endif #ifdef __cplusplus } #endif #endif