Emulating Swift's “defer” in C, with Clang or GCC+Blocks
1–10 of 33 posts
Re: Emulating Swift's “defer” in C, with Clang or GCC+Blocks
#2I wasn't aware of C Blocks.
Re: Emulating Swift's “defer” in C, with Clang or GCC+Blocks
#3The canonical method in C is to jump to a named label which hosts some functions to unwind/close any open descriptors or operations. As it involves the use of a goto statement, it drives certain people mad. I wasn't aware of C Blocks.
Re: Emulating Swift's “defer” in C, with Clang or GCC+Blocks
#4(Note that, IMO, the semantics of the feature as implemented in the article are preferable to those of Golang, so I wouldn't personally go to the effort of trying to duplicate Go's behavior.)
Re: Emulating Swift's “defer” in C, with Clang or GCC+Blocks
#5Re: Emulating Swift's “defer” in C, with Clang or GCC+Blocks
#6Re: Emulating Swift's “defer” in C, with Clang or GCC+Blocks
#7`defer` in a nonstandard extension to C implemented by a single compiler.
Re: Emulating Swift's “defer” in C, with Clang or GCC+Blocks
#8The canonical method in C is to jump to a named label which hosts some functions to unwind/close any open descriptors or operations. As it involves the use of a goto statement, it drives certain people mad. I wasn't aware of C Blocks.
int main(){ __block int (^foo)(int x) = ^ int (int x) { if(x
versus the GCC: int main(){ int foo(int x) { if(x
if you want to see what I'm talking about.CLANG: http://pastebin.com/37A9by4V
GCC: http://pastebin.com/RMEDnwxi
However, defer does look interesting, and implementing it for GCC is very easy:
#define defer_(x) do{}while(0); \
auto void _dtor1_##x(); \
auto void _dtor2_##x(); \
int __attribute__((cleanup(_dtor2_##x))) _dtorV_##x=69; \
void _dtor2_##x(){if(_dtorV_##x==42)return _dtor1_##x();};_dtorV_##x=42; \
void _dtor1_##x()
#define defer__(x) defer_(x)
#define defer defer__(__COUNTER__)
You don't have to use the stupid block-syntax either, just: in = fopen("whatever", "r");
defer { fclose(in); }