在 GNUStep 中使用 Objective-C Lambda 语法

Using Objective-C Lambda syntax with GNUStep

Objective-C 有一个类似 Lambda 的语法,称为 Blocks,由 Clang 引入,但它需要运行时支持。如果我的环境是 GNUStep 而不是 Apple 的运行时,我该如何使用它?

要测试的简单代码 运行 (t.m):

#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