提交 a6160864 编写于 作者: W wizardforcel

typo

上级 0761b617
......@@ -6,7 +6,7 @@
我在学习面向对象编程之前学了C,所以它有助于我在C中构建面向对象系统,来理解OOP的基本含义。你可能在学习C之前就学了OOP语言,所以这章也可能会起到一种衔接作用。这个联系中,你将会构建一个简单的对象系统,但是也会了解更多关于C预处理器的事情。
这个练习会构建一个简单的游戏,在游戏中你会在一个小型的城堡中杀死弥诺陶洛斯,并没有任何神奇之处,只是四个房间和一个坏家伙。这个练习同时是一个多文件的项目,并且比起之前的一些程序看起来更像一个真正的C程序。我在这个贾少C预处理器的原因,是你需要它来在你自己的程序中创建多个文件。
这个练习会构建一个简单的游戏,在游戏中你会在一个小型的城堡中杀死弥诺陶洛斯,并没有任何神奇之处,只是四个房间和一个坏家伙。这个练习同时是一个多文件的项目,并且比起之前的一些程序看起来更像一个真正的C程序。我在这里介绍C预处理器的原因,是你需要它来在你自己的程序中创建多个文件。
## C预处理器如何工作
......@@ -243,10 +243,10 @@ int Map_init(void *self);
+ 我调用了`NEW(Room, "Hello.")`,C预处理器会将其展开为`Object_new(sizeof(Room), RoomProto, "Hello.")`
+ 执行过程中,在`Object_new`的内部我分配了`Room`大小的一块内存,但是用`Object *el`来指向它。
+ 由于C将`Room.proto`字段放在开头,这意味着`el`指针实际上指向了能访问到完整`Object`结构体的,足够大小的一块内存。它不知道这块内存叫做`proto`
+ 接下来它使用`Object *el`指针,通过`*el = proto`来设置这块内存的内容。要记住你可以复制结构体,而且`*el`的意思是“`el`所指向对象的值”,所以整条语句意思是“将`el`所指向对象的值赋`proto`”。
+ 接下来它使用`Object *el`指针,通过`*el = proto`来设置这块内存的内容。要记住你可以复制结构体,而且`*el`的意思是“`el`所指向对象的值”,所以整条语句意思是“将`el`所指向对象的值赋`proto`”。
+ 由于这个谜之结构体被填充为来自`proto`的正确数据,这个函数接下来可以在`Object`上调用`init`,或者`destroy`。但是最神奇的一部分是无论谁调用这个函数都可以将它们改为想要的东西。
结合上面这些东西,我就就可以使用者一个函数来创建新的类型,并且向它们提供新的函数来修改它们的行为。这看起来像是“黑魔法”,但它是完全有效的C代码。实际上,有少数标准的系统函数也以这种方式工作,我们将会用到一些这样的函数在网络程序中转换地址。
结合上面这些东西,我就可以使用这一个函数来创建新的类型,并且向它们提供新的函数来修改它们的行为。这看起来像是“黑魔法”,但它是完全有效的C代码。实际上,有少数标准的系统函数也以这种方式工作,我们将会用到一些这样的函数在网络程序中转换地址。
编写完函数定义和数据结构之后,我现在就可以实现带有四个房间和一个牛头人的游戏了。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册