2017-01-13 13 views
1

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

ответ

0

Простой код для тестирования и запуска (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 

Compile:

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