Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
lcthw-zh
提交
a6160864
L
lcthw-zh
项目概览
OpenDocCN
/
lcthw-zh
8 个月 前同步成功
通知
2
Star
18
Fork
5
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
lcthw-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a6160864
编写于
7月 28, 2016
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
typo
上级
0761b617
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
3 addition
and
3 deletion
+3
-3
ex19.md
ex19.md
+3
-3
未找到文件。
ex19.md
浏览文件 @
a6160864
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录