5 ms·
If you use clang, blocks are another approach. [0] http://en.wikipedia.org/wiki/Blocks_(C_language_extension) http://en.wikipedia.org/wiki/Blocks_(C_language_e
by misframer 12y ago
If you use clang, blocks are another approach.
[0] http://en.wikipedia.org/wiki/Blocks_(C_language_extension) http://en.wikipedia.org/wiki/Blocks_(C_language_extension)
[1] http://clang.llvm.org/docs/BlockLanguageSpec.html http://clang.llvm.org/docs/BlockLanguageSpec.html
- mtdewcmu 12y agoI thought those were only available on OSX and iOS.
- Moto7451 12y agoNope, clang can be used on BSD, Linux, and Windows as well. http://clang.llvm.org/get_started.html http://clang.llvm.org/get_started.html
- mtdewcmu 12y agoI'm aware of that, but do you get blocks?
- binarycrusader 12y agoIndeed, I don't think you do: Blocks are supported for programs developed for Mac OS X 10.6+ and iOS 4.0+,[1] although third-party runtimes allow use on Mac OS X 10.5 and iOS 2.2+.[2] http://en.wikipedia.org/wiki/Blocks_(C_language_extension) http://en.wikipedia.org/wiki/Blocks_(C_language_extension)
- nitrogen 12y agoThat page does mention Linux in one section: https://en.wikipedia.org/wiki/Blocks_%28C_language_extension%29#Compile https://en.wikipedia.org/wiki/Blocks_%28C_language_extension...
- binarycrusader 12y agoThat's really annoying; the headline claims one thing and the later text clearly contradicts. Regardless, both of you appear to be correct: BlocksRuntime - a target-independent implementation of Apple "Blocks" runtime interfaces. http://compiler-rt.llvm.org/ http://compiler-rt.llvm.org/
- fyolnish 12y agoYou do, I've used them on Linux myself.
- e12e 12y agoEg on Debian: apt-get install libblocksruntime0 libblocksruntime-dev http://compiler-rt.llvm.org/ http://compiler-rt.llvm.org/
- graphitemaster 12y agoThe problem with clang blocks is they're represented as a Objective-C object, this makes them unusable in APIs that expect a function pointer, the only way you can cast them to a function pointer is to define the structure which represents the block and mmap executable code pages to marshal the call. Such a library exists that binds them to libffi here https://github.com/mikeash/MABlockClosure https://github.com/mikeash/MABlockClosure This feat alone makes blocks essentially useless unless your entire API is also block-based, as in T (^foo)(...) vs T(*foo)(...).
- mtdewcmu 12y agoI don't think they could be an ObjectiveC object, because they're described as C, not ObjectiveC. I think the problems you're describing are ones that are going to be faced in any attempt at C closures. Closures have memory attached, that's the appeal of them and also the source of all the problems.
- graphitemaster 12y agoNope, they're an ObjectiveC object with some specialties at the compiler level. Google how they're implemented.
- fyolnish 12y agoAn objective-c object is just a pointer to a struct. You don't need the objective-c runtime to call a block. Block_copy etc are implemented in libclosure which iirc does not require libobjc either. But of course if you ARE writing objc, they are valid objects and can be treated as such
- graphitemaster 12y agoCorrect, the problem is to call the function you cannot treat it as a standard function since it's pointing to a struct, the struct does contain the actual function pointer but there is an implicit `this' first argument to that function pointer which has to be that struct itself. This means you cannot use the block in an API that explicitly requires a function pointer, instead the API must specifically be aware of the block and would need to support it.