Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
lcthw-zh
提交
d0de5c78
L
lcthw-zh
项目概览
OpenDocCN
/
lcthw-zh
9 个月 前同步成功
通知
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 搜索 >>
提交
d0de5c78
编写于
8月 01, 2016
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
typo
上级
a6160864
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
6 addition
and
6 deletion
+6
-6
ex17.md
ex17.md
+1
-1
ex20.md
ex20.md
+5
-5
未找到文件。
ex17.md
浏览文件 @
d0de5c78
...
@@ -225,7 +225,7 @@ int main(int argc, char *argv[])
...
@@ -225,7 +225,7 @@ int main(int argc, char *argv[])
用于错误报告的
`errno`
和
`perror`
用于错误报告的
`errno`
和
`perror`
当函数返回了一个错误时,它通常设置一个叫做
`errno`
的“外部”变量,来描述发生了什么错误。它们
知识数字,所以你可以使用
`pee
ror`
来“打印出错误信息”。
当函数返回了一个错误时,它通常设置一个叫做
`errno`
的“外部”变量,来描述发生了什么错误。它们
只是数字,所以你可以使用
`per
ror`
来“打印出错误信息”。
文件函数
文件函数
...
...
ex20.md
浏览文件 @
d0de5c78
...
@@ -10,7 +10,7 @@
...
@@ -10,7 +10,7 @@
## C的错误处理问题
## C的错误处理问题
几乎每个编程语言中,错误处理都非常难。有些语言尽可能试图避免错误这个概念,而另一些语言发明了复杂了控制结构,比如异常来传递错误状态。当然的错误大多是因为程序员
嘉
定错误不会发生,并且这一乐观的思想影响了他们所用和所创造的语言。
几乎每个编程语言中,错误处理都非常难。有些语言尽可能试图避免错误这个概念,而另一些语言发明了复杂了控制结构,比如异常来传递错误状态。当然的错误大多是因为程序员
假
定错误不会发生,并且这一乐观的思想影响了他们所用和所创造的语言。
C通过返回错误码或设置全局的
`errno`
值来解决这些问题,并且你需要检查这些值。这种机制可以检查现存的复杂代码中,你执行的东西是否发生错误。当你编写更多的C代码时,你应该按照下列模式:
C通过返回错误码或设置全局的
`errno`
值来解决这些问题,并且你需要检查这些值。这种机制可以检查现存的复杂代码中,你执行的东西是否发生错误。当你编写更多的C代码时,你应该按照下列模式:
...
@@ -90,7 +90,7 @@ dbg.h:10
...
@@ -90,7 +90,7 @@ dbg.h:10
dbg.h:11
dbg.h:11
用于替代的
`#define debug`
,它将任何使用
`debug("format", arg1, arg2)`
的地方替换成
`fprintf`
对
`stderr`
的调用。许多程序员并不知道,但是你的确可以创建
列斯与
`printf`
的可变参数宏。许多C编译器(实际上是C预处理器)并不支持它,但是gcc可以做到。这里的魔法是使用
`##__VA_ARGS__`
,意思是将剩余的所有额外参数放到这里。同时也要注意,使用了
`__FILE__`
和
`__LINE__`
来获取当前
`fine:line`
用于调试信息。这会非常有帮助。
用于替代的
`#define debug`
,它将任何使用
`debug("format", arg1, arg2)`
的地方替换成
`fprintf`
对
`stderr`
的调用。许多程序员并不知道,但是你的确可以创建
与
`printf`
类似
的可变参数宏。许多C编译器(实际上是C预处理器)并不支持它,但是gcc可以做到。这里的魔法是使用
`##__VA_ARGS__`
,意思是将剩余的所有额外参数放到这里。同时也要注意,使用了
`__FILE__`
和
`__LINE__`
来获取当前
`fine:line`
用于调试信息。这会非常有帮助。
dbg.h:12
dbg.h:12
...
@@ -122,7 +122,7 @@ dbg.h:28
...
@@ -122,7 +122,7 @@ dbg.h:28
## 使用dbg.h
## 使用dbg.h
下面是一个例子,在一个小的程序中使用了
`dbg.h`
的所有函数。这实际上并没有做什么事情,
知识想
你演示了如何使用每个宏。我们将在接下来的所有程序中使用这些宏,所有要确保理解了如何使用它们。
下面是一个例子,在一个小的程序中使用了
`dbg.h`
的所有函数。这实际上并没有做什么事情,
只是向
你演示了如何使用每个宏。我们将在接下来的所有程序中使用这些宏,所有要确保理解了如何使用它们。
```
c
```
c
#include "dbg.h"
#include "dbg.h"
...
@@ -268,9 +268,9 @@ $ ./ex20 test
...
@@ -268,9 +268,9 @@ $ ./ex20 test
看到
`check`
失败之后,它是如何打印具体的行号了吗?这会为接下来的调试工作节省时间。同时也观察
`errno`
被设置时它如何打印错误信息。同样,这也可以节省你调试的时间。
看到
`check`
失败之后,它是如何打印具体的行号了吗?这会为接下来的调试工作节省时间。同时也观察
`errno`
被设置时它如何打印错误信息。同样,这也可以节省你调试的时间。
## C预处理器如
果
扩展宏
## C预处理器如
何
扩展宏
现在我会
想
你简单介绍一些预处理器的工作原理,让你知道这些宏是如何工作的。我会拆分
`dbg.h`
中阿最复杂的宏并且让你运行
`cpp`
来让你观察它实际上是如何工作的。
现在我会
向
你简单介绍一些预处理器的工作原理,让你知道这些宏是如何工作的。我会拆分
`dbg.h`
中阿最复杂的宏并且让你运行
`cpp`
来让你观察它实际上是如何工作的。
假设我有一个函数叫做
`dosomething()`
,执行成功是返回0,发生错误时返回-1。每次我调用
`dosomething`
的时候,我都要检查错误码,所以我将代码写成这样:
假设我有一个函数叫做
`dosomething()`
,执行成功是返回0,发生错误时返回-1。每次我调用
`dosomething`
的时候,我都要检查错误码,所以我将代码写成这样:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录