最近在研究block的底层实现方式,查看了大量的文章都说需要先把block代码转换成C++。然后在网上搜了一些资料,终于完成了代码的转换。下面就说一下代码转换的实现过程:
-
首先在桌面创建一个文件夹c:
-
然后打开终端:
-
ls查看当前文件内容,并cd到刚创建的c文件夹下:
bogon:~ $ ls
AboutBall ControllerSlide Library
Applications Desktop Movies
AwesomeProject Documents Music
CAShapeLayerAnimation Downloads Pictures
bogon:~ $ cd Desktop/c
bogon:c $ ls
- 在文件夹中创建一个math.c的文件:
bogon:c $ touch math.c
执行完成之后,c文件夹中会生成一个存放C语言的文件math.c,如下图:
- 用Vim编辑器编辑math.c文件:
bogon:c $ vim math.c
- 进去之后按下i进入插入编辑模式,放入要创建的C语言代码,按ESC保存,按:wq退出:
C语言示例代码:
#include “stdio.h”
#include “math.h”
int main()
{
^{ };
}
- 最后执行
clang -rewrite-objc math.c
将math.h中的C转换成C++代码:
bogon:c $ clang -rewrite-objc math.c
生成的math.cpp就是C++:
附上一段转换后的C++代码:
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
}
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()
{
((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
}
static struct IMAGE_INFO { unsigned version; unsigned flag; } _OBJC_IMAGE_INFO = { 0, 2 };
网友评论