【问题标题】:Using Objective-C Lambda syntax with GNUStep在 GNUStep 中使用 Objective-C Lambda 语法
【发布时间】:2017-01-13 21:53:42
【问题描述】:

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

【问题讨论】:

    标签: objective-c clang llvm objective-c-blocks gnustep


    【解决方案1】:

    测试和运行的简单代码(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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多