我是靠谱客的博主 勤恳眼睛,最近开发中收集的这篇文章主要介绍C语言趣味讨论,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

额,忽略标题吧,我想了很长时间不知道用什么名字好了。其实是这样的,最近看了一本书 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语言趣味讨论所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部