美文网首页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++ 基础哦。

相关文章

  • 探索Objective-C中的class和对象在C++中的原理实

    前言:OC 可以编译成C++,从C++的角度探索class和对象的的本质 1、把OC文件转成C++文件 生成下面的...

  • OC对象的本质

    OC的底层实现 OC代码底层实现都是由OC编译成C/C++,然后再编译成汇编语言最后转变成机器语言。所以由此可见,...

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

    有时候 看到oc的代码,但是不知道里面做了什么 ,就例如OC里面的block ,他到底做了什么呢,__block...

  • iOS底层原理--OC对象的本质

    1、NSObject的本质是什么? 分析: OC代码的底层实现实质是C/C++代码,继而编译成汇编代码,最终变成机...

  • isa结构分析

    isa结构分析 OC对象的本质 clang命令 把oc类编译成c++文件,对象在底层编译成struct 联合体(共...

  • OC对象的本质 - objc_object

    通过编译查看对象的本质 研究OC对象的底层结构可以通过将OC对象代码编译成C++代码来进行分析,然后结合源码学习。...

  • 一种纯粹的C++回调OC函数/方法的方式

    起因 因为在做跨端SDK,语言用的C++,想尽量把C++代码和OC代码解耦,OC调用C++倒是简单,改个源文件的名...

  • iOS编译命令

    将OC代码转换成C++代码 OC语言基于C/C++语言,实际上要先经过一层编译将OC代码转换为C++代码,对应的c...

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

    将Objective-C代码转换为C\C++代码 如果需要链接其他框架,使用-framework参数。比如-fra...

  • 笔记:WASM WebAssembly

    HelloWorld 编写C++代码:helloworld.cpp 使用Docker将C++代码,编译成wasm,...

网友评论

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

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