Использование лямбда-синтаксиса Objective-C с GNUStep

Objective-C имеет лямбда-подобный синтаксис под названием Blocks, который был представлен Clang, но он требует поддержки во время выполнения. Как я могу использовать его, когда моя среда GNUStep вместо времени выполнения Apple?

1 ответ

Решение

Простой код для тестирования и запуска (тм):

#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSException.h>
#import <Foundation/NSDebug.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <Foundation/NSObjCRuntime.h>

#include <string.h>

#if defined(GNUSTEP)
#import <GNUstepBase/GSObjCRuntime.h>
#else
#include <objc/runtime.h>
#endif

void test(void (^callback)(void))
{
    callback();
}

int main(int argc, char *argv[])
{
    @autoreleasepool
    {
        int multiplier = 7;
        int (^myBlock)(int) = ^(int num)
        {
            return num * multiplier;
        };

        NSLog(@"%d", myBlock(3));

        test(^(void)
        { 
            NSLog(@"Inside");
        });

        NSLog(@"BLAH");
    }

    return 0;
}

Проверено на Ubuntu 16

Установка:

apt-get install -y build-essential gobjc gobjc++ gnustep gnustep-devel libgnustep-base-dev clang gnustep-make llvm libblocksruntime-dev

Обобщение:

clang -I `gnustep-config --variable=GNUSTEP_SYSTEM_HEADERS` -L `gnustep-config --variable=GNUSTEP_SYSTEM_LIBRARIES` -lgnustep-base -fconstant-string-class=NSConstantString -D_NATIVE_OBJC_EXCEPTIONS -fblocks -lobjc -o t t.m -lBlocksRuntime

Бежать:

./t

Если вам не хватает objc/runtime.h скачать и распаковать GNUStep libobjc:

wget http://download.gna.org/gnustep/libobjc2-1.6.tar.gz
tar xzvf libobjc2-1.6.tar.gz
cp -r libobjc2-1.6/objc /usr/include/GNUstep
Другие вопросы по тегам