美文网首页iOS 宝典iOS开发
把OC代码 编译成C/C++

把OC代码 编译成C/C++

作者: jianshu小赵 | 来源:发表于2017-04-27 17:13 被阅读200次

    有时候 看到oc的代码,但是不知道里面做了什么 ,就例如OC里面的block ,他到底做了什么呢,__block又干了啥, 其实你搜啊搜啊 ,各种说法说的乱七八糟 ,不如咱把它编译成底层的代码看看底层到底咋写的;

    首先看看xcode 都有哪些常见的文加后缀:

        Objective-C文件的后缀名是 .h和.m
    
        C语言的后缀名是.h和.c
    
        C++的后缀名是.h和.cpp 
     
        混合代码后缀名是 .h和.mm
    

    接写来 来一个简单的示例

    1.cd 到你所要编译的文件夹 的指定路径
    cd /Users/zhaozilong/Desktop/demos学习代码/编译\ oc/编译\ oc 
    
    2.1输入编译指令
    clang -rewrite-objc main.m
    
    2. 2 编译viewController.m之类的文件 需要一些编译环境 和库的参数配置,或者是三方库头文件 并不简单现在就只 写一个关于 普通UIviewController.m 的编译
    xcrun -sdk iphonesimulator clang -rewrite-objc ViewController.m
    

    编译完成后没报什么错的话 就说明编译成了,你会在你的文件夹里发现一个.cpp文件

    来看个示例代码:

    OC 代码

    #include <stdio.h>
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            int outA = 8;
            int (^myint) (int) = ^(int a) {
                return outA + a ;
            };
            outA = 5;
            int result = myint(3);
            printf("%d", result);
            return 0;
        }
    }
    

    ** C++代码 **
    我就贴出来一部分 关于此部分的代码

    extern "C" {
    extern const int sys_nerr;
    extern const char *const sys_errlist[];
    
    int asprintf(char ** , const char * , ...) __attribute__((__format__ (__printf__, 2, 3)));
    char *ctermid_r(char *);
    char *fgetln(FILE *, size_t *);
    const char *fmtcheck(const char *, const char *);
    int fpurge(FILE *);
    void setbuffer(FILE *, char *, int);
    int setlinebuf(FILE *);
    int vasprintf(char ** , const char * , va_list) __attribute__((__format__ (__printf__, 2, 0)));
    FILE *zopen(const char *, const char *, int);
    
    
    
    
    
    FILE *funopen(const void *,
                     int (* _Nullable)(void *, char *, int),
                     int (* _Nullable)(void *, const char *, int),
                     fpos_t (* _Nullable)(void *, fpos_t, int),
                     int (* _Nullable)(void *));
    }
    
    
    struct __main_block_impl_0 {
      struct __block_impl impl;
      struct __main_block_desc_0* Desc;
      int outA;  //看这里
      __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _outA, int flags=0) : outA(_outA) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
      }
    };
    static int __main_block_func_0(struct __main_block_impl_0 *__cself, int a) {
      int outA = __cself->outA; // bound by copy
    
                return outA + a ;
            }
    
    static struct __main_block_desc_0 {
      size_t reserved;
      size_t Block_size;
    } __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
    int main(int argc, char * argv[]) {
        /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
            int outA = 8;
            int (*myint) (int) = ((int (*)(int))&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, outA));// 看这里  看这里 看这里
            
            outA = 5;
            int result = ((int (*)(__block_impl *, int))((__block_impl *)myint)->FuncPtr)((__block_impl *)myint, 3);
            printf("%d", result);
            return 0;
        }
    }
    static struct IMAGE_INFO { unsigned version; unsigned flag; } _OBJC_IMAGE_INFO = { 0, 2 };
    

    这样一来 就能看清实现了 如果想看__block情况下的代码 把你的源码修改一下重新编译 然后两者对比一下就能看出来区别了 解惑吧 但是要有c 或 c++ 基础哦。

    相关文章

      网友评论

        本文标题:把OC代码 编译成C/C++

        本文链接:https://www.haomeiwen.com/subject/vuzgzttx.html