概述
额,忽略标题吧,我想了很长时间不知道用什么名字好了。其实是这样的,最近看了一本书 Writing Bug-free C Code (以下简称WBCC),本来打算好好研究下的,因为这本书讲到几点带来bug的原因,比如头文件中过多数据结构声明,过多全局变量,编写难以维护的代码等都是些很常见的问题。但是看了两章多一点的时候发现内容对我来说太高深了,以目前的水平很多地方看不明白,所以暂时放弃了,但是前面还是有一部分觉得很有意思的东西,于是就决定还是写篇博文总结讨论一下。(原书链接:www.duckware.com/bugfreec/index.html)
1. 编译时断言(CompilerAssert)
提到断言,首先想到的应该就是assert()函数,这个函数可以保证如果断言条件不成立,那么程序立即终止运行,我们可以把这个叫做run-time assert,但是有的时候我们可能想在程序编译的时候就断言,也就是如果某一个条件不成立,那么程序就不再继续编译下去,不生成可执行文件,可以称作 compile-time assert。我们知道C语言中如果数组的大小是负数的话,那么程序在编译的时候就会报错,所以如果将需要断言的表达式的判断结果(条件成立结果为1,不成立为-1)作为数组的大小,那么就可以实现编译时的断言。原书作者的方法在这里就不提及了,经过搜索,我在StackOverflow上找到了这么一段容易理解的代码,注意##是用来连接前后的字符,比如a##b就是ab。(原提问链接在此:http://stackoverflow.com/questions/807244/c-compiler-asserts-how-to-implement 我将代码注释大致翻译一下):
/** 编译时断言
* 条件成立,编译继续
* 条件不成立,相当于用typedef定义一个类似于下面这种形式的数组:
* typedef assertion_failed_file_h_42[-1]
* 其中file是文件名, 42是断言所在行, -1是断言条件不成立产生的结果
* 参数解释:
* predicate是断言表达式,它的结果必须是一个bool值
* file是断言所在源文件的名字
*/
#define CASSERT(predicate, file) _impl_
最后
以上就是勤恳眼睛为你收集整理的C语言趣味讨论的全部内容,希望文章能够帮你解决C语言趣味讨论所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复