struct objc_selector; struct objc_class; #ifndef OBJC_SUPER struct objc_super { struct objc_object *object; struct objc_object *superClass; objc_super(struct objc_object *o, struct objc_object *s) : object(o), superClass(s) {} }; #define OBJC_SUPER #endif #ifndef _REWRITER_typedef_Protocol typedef struct objc_object Protocol; #define _REWRITER_typedef_Protocol #endif #define __OBJC_RW_EXTERN extern "C" __declspec(dllimport) __OBJC_RW_EXTERN struct objc_object *objc_msgSend(struct objc_object *, struct objc_selector *, ...); __OBJC_RW_EXTERN struct objc_object *objc_msgSendSuper(struct objc_super *, struct objc_selector *, ...); __OBJC_RW_EXTERN struct objc_object *objc_msgSend_stret(struct objc_object *, struct objc_selector *, ...); __OBJC_RW_EXTERN struct objc_object *objc_msgSendSuper_stret(struct objc_super *, struct objc_selector *, ...); __OBJC_RW_EXTERN double objc_msgSend_fpret(struct objc_object *, struct objc_selector *, ...); __OBJC_RW_EXTERN struct objc_object *objc_getClass(const char *); __OBJC_RW_EXTERN struct objc_object *objc_getMetaClass(const char *); __OBJC_RW_EXTERN void objc_exception_throw(struct objc_object *); __OBJC_RW_EXTERN void objc_exception_try_enter(void *); __OBJC_RW_EXTERN void objc_exception_try_exit(void *); __OBJC_RW_EXTERN struct objc_object *objc_exception_extract(void *); __OBJC_RW_EXTERN int objc_exception_match(struct objc_class *, struct objc_object *); __OBJC_RW_EXTERN void objc_sync_enter(struct objc_object *); __OBJC_RW_EXTERN void objc_sync_exit(struct objc_object *); __OBJC_RW_EXTERN Protocol *objc_getProtocol(const char *); #ifndef __FASTENUMERATIONSTATE struct __objcFastEnumerationState { unsigned long state; void **itemsPtr; unsigned long *mutationsPtr; unsigned long extra[5]; }; __OBJC_RW_EXTERN void objc_enumerationMutation(struct objc_object *); #define __FASTENUMERATIONSTATE #endif #ifndef __NSCONSTANTSTRINGIMPL struct __NSConstantStringImpl { int *isa; int flags; char *str; long length; }; #ifdef CF_EXPORT_CONSTANT_STRING extern "C" __declspec(dllexport) int __CFConstantStringClassReference[]; #else __OBJC_RW_EXTERN int __CFConstantStringClassReference[]; #endif #define __NSCONSTANTSTRINGIMPL #endif #ifndef BLOCK_IMPL #define BLOCK_IMPL struct __block_impl { void *isa; int Flags; int Size; void *FuncPtr; }; enum { BLOCK_HAS_COPY_DISPOSE = (1<<25), BLOCK_IS_GLOBAL = (1<<28) }; // Runtime copy/destroy helper functions __OBJC_RW_EXTERN void _Block_copy_assign(void *, void *); __OBJC_RW_EXTERN void _Block_byref_assign_copy(void *, void *); __OBJC_RW_EXTERN void _Block_destroy(void *); __OBJC_RW_EXTERN void _Block_byref_release(void *); __OBJC_RW_EXTERN void *_NSConcreteGlobalBlock; __OBJC_RW_EXTERN void *_NSConcreteStackBlock; #endif #undef __OBJC_RW_EXTERN #define __attribute__(X) // ..\clang -rewrite-objc -fms-extensions simpleblock.c #include using namespace std; #include "Block.h" struct __main_block_impl_0 { struct __block_impl impl; __main_block_impl_0(void *fp, int flags=0) { impl.isa = 0/*&_NSConcreteStackBlock*/; impl.Size = sizeof(__main_block_impl_0); impl.Flags = flags; impl.FuncPtr = fp; } }; static void __main_block_func_0(struct __main_block_impl_0 *__cself, int x) { cout << "Hello, " << x << endl; } int main(int argc, char **argv) { void(*aBlock)(int x); void(*bBlock)(int x); aBlock = (void (*)(int))&__main_block_impl_0((void *)__main_block_func_0); ((void (*)(struct __block_impl *, int))((struct __block_impl *)aBlock)->FuncPtr)((struct __block_impl *)aBlock, 42); bBlock = (void *)Block_copy(aBlock); ((void (*)(struct __block_impl *, int))((struct __block_impl *)bBlock)->FuncPtr)((struct __block_impl *)bBlock, 46); Block_release(bBlock); return 0; }