我是靠谱客的博主 虚心篮球,最近开发中收集的这篇文章主要介绍c语言编译成oc文件路径,把OC代码 编译成C/C++,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

有时候 看到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

arc环境:clang -rewrite-objc -fobjc-arc main.m

2. 2 编译viewController.m之类的文件 需要一些编译环境 和库的参数配置,或者是三方库头文件 并不简单现在就只 写一个关于 普通UIviewController.m 的编译

xcrun -sdk iphonesimulator clang -rewrite-objc ViewController.m

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

来看个示例代码:

OC 代码

#include

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++ 基础哦。

最后

以上就是虚心篮球为你收集整理的c语言编译成oc文件路径,把OC代码 编译成C/C++的全部内容,希望文章能够帮你解决c语言编译成oc文件路径,把OC代码 编译成C/C++所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部