2011年 03月 03日 星期四 12:36:51 CST
0.标准头文件的特点:具有幂等性、相互独立性、和文件级别的声明等同。
库中的每一个可见函数都占据着单独的C源文件;
每个隐藏的名字都以一个下划线和一个大写字母开头;
库中隐藏的函数和数据对象通常占据以x开头命名的C源文件;
在一个库的可见函数定义中,函数名被一对括号括住,所有这样的函数声明都会被相应的头文件中的宏定义所掩盖,所以这对括号阻止了翻译程序识别和展开宏。
1. 头文件<assert.h>唯一的目的就是提供宏assert的定义。
2.可以通过在程序的某些地方定义宏NDEBUG来改变assert的展开方式,如果NDEBUG在包含了<assert.h>d的源文件中某处被定义为宏名,那么宏assert就被直接定义为:#define assert(ignore) ((void) 0)
3.宏assert应该作为一个宏而不是一个实际的函数来实现。如果为了访问一个实际函数而禁止宏定义,那么这种行为是未定义的。
4.源文件的名字和源文件的行数分别是预定义的宏_FILE_和_LINE_的值。
5.宏assert没有任何返回值。
6.对<assert.h>来说,每次包含它的时候它的行为都会发生变化。该头文件会改变assert的定义来适应NDEBUG当前的定义状态。
7.要打开断言可以这样写:
#undef NDEBUG
#include <assert.h>
要关闭断言,可以这样写:
#define NDEBUG
#include <assert.h>
8.宏NDEBUG可以重定义,这是良性重定义。
9.宏不能直接调用库的任何输出函数(为了保证库头文件之间的独立性)。
10.一个程序如果不包含某个头文件,就可以定义宏来对该头文件中的任意名字重新命名。
11.宏必须能扩展为一个void类型的表达式。
12.宏应该可以扩展为一个有效并且紧凑的代码。
13.预处理运算符
#(单井号) ——字符串化运算符(后边没有参数时就是空指令,它没有任何作用)
##(双井号) ——连接运算符
#@ ——字符化运算符
14.内置宏__LINE__没有扩展成字符串字面量,它变成了一个十进制常量。把它转换成适当的形式需要一个额外的处理层。那要通过向头文件中添加两个隐藏的宏_STR和_VAL来实现。其中一个宏用它的十进制常量扩展来取代__LINE__,另一个是把十进制常量转化为一个字符串字面量。忽略其中任一个都会得到字符串字面量"__LINE__",而不是你想要的结果。
15.当宏参数是另一个宏的时候 ,需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. (对于理解"_VAL(__LINE__)"是很重要的!!!)
PS:宏_VAL和_STR的命名可以是任意的。
分享到:
相关推荐
B.6 诊断:<assert.h> B.7 变量变元表:<stdarg.h> B.8 非局部跳转:<setjmp.h> B.9 信号处理:<signal.h> B.10 日期与时间函数:<time.h> B.11 由实现定义的限制:<limits.h>和 <float.h> 附录C 变更小结
1. `<assert.h>`:诊断 `assert()`宏用于在程序调试阶段检查条件是否为真,如果条件不满足,它会终止程序并打印错误消息。这对于检测代码中的逻辑错误非常有用。 2. `<ctype.h>`:字符类别测试 这个头文件包含了...
B.6 诊断:<assert.h> B.7 变量变元表:<stdarg.h> B.8 非局部跳转:<setjmp.h> B.9 信号处理:<signal.h> B.10 日期与时间函数:<time.h> B.11 由实现定义的限制:<limits.h>和 <float.h> 附录C 变更小结
第一章主要讨论了C标准库,这是C语言的核心部分,包含了各种基础功能。以下是一些关键头文件及其功能: 1. `<assert.h>`:这个头文件提供了断言宏`assert()`,用于在开发阶段检查程序中的逻辑错误。当条件为假时,...
1. <assert.h>:提供诊断程序中逻辑错误的宏assert()。 2. <ctype.h>:包含用于字符类型检查和转换的函数,如isalnum()检查字符是否为字母或数字。 3. <errno.h>:定义错误号常量,为错误处理提供标准方法。 4. ...
#### 第一章:C标准库概览 本章节将详细介绍C语言标准库中的各个部分,包括但不限于诊断、字符类别测试、错误处理等方面的基础知识及其应用场景。 ### 1. `<assert.h>`:诊断 - **定义**:`<assert.h>` 文件仅...
第一章:C标准库 1. `<assert.h>`:这个头文件提供了`assert`宏,用于在程序中插入断言,帮助诊断程序运行时的逻辑错误。当表达式的值不为真(即0)时,assert会输出错误信息并终止程序。 2. `<ctype.h>`:包含一...
B.6 诊断:<assert.h> B.7 变量变元表:<stdarg.h> B.8 非局部跳转:<setjmp.h> B.9 信号处理:<signal.h> B.10 日期与时间函数:<time.h> B.11 由实现定义的限制:<limits.h>和 <float.h> 附录C 变更小结
#### 第一章:C标准库概览 本章节将详细介绍C标准库中的几个关键部分,并通过具体的示例帮助读者更好地理解它们的功能和应用场景。 ### 1. `<assert.h>`:诊断功能 #### 宏 `assert` - **定义**:`assert` 是一...
B.6 诊断:<assert.h> B.7 变量变元表:<stdarg.h> B.8 非局部跳转:<setjmp.h> B.9 信号处理:<signal.h> B.10 日期与时间函数:<time.h> B.11 由实现定义的限制:<limits.h>和 <float.h> 附录C 变更小结
B.6 诊断:<assert.h> B.7 变量变元表:<stdarg.h> B.8 非局部跳转:<setjmp.h> B.9 信号处理:<signal.h> B.10 日期与时间函数:<time.h> B.11 由实现定义的限制:<limits.h>和 <float.h> 附录C 变更小结 ...
#### 第一章:C标准库 在这一章节中,我们将深入了解C语言标准库中的各个头文件及其提供的功能。这些库函数为C语言程序员提供了强大的工具箱,使得开发人员能够高效地进行各种操作。 ##### 1. `<assert.h>`:诊断 ...
### 第一章:C标准库 C语言的标准库提供了许多核心功能,包括诊断、字符处理、错误处理、整型常量、地域环境、数学运算、非局部跳转、信号处理、可变参数列表、公共定义、输入输出和实用函数。例如: - `<assert.h>`...
头文件可以包含标准库函数的声明,如<stdio.h>(用于输入/输出)、<stdlib.h>(通用实用函数)或<stdio.h>(内存管理)等。 在解决C语言编程问题时,以下是一些关键知识点: 1. **数据类型**:理解C语言中的基本...
C语言提供了`<stdlib.h>`库中的`rand()`函数来生成随机数,配合`srand()`函数设置种子以确保每次运行的结果有所不同。理解随机数生成的原理和使用方法对于编写各种涉及概率和不确定性的程序至关重要。 3. **条件...
有两种形式:`#include <文件名>`用于包含标准库中的头文件,如`#include <stdio.h>`,编译器会在标准目录下寻找这些文件;`#include "文件名"`则优先查找当前目录下的文件,如果找不到,再尝试标准目录。头文件通常...
8. **位操作**:C语言提供了位运算符(&、|、^、~、<<、>>),这对于底层硬件操作和高效数据处理至关重要。 9. **错误处理和调试**:学会使用assert宏进行断言检查,以及如何利用编译器警告来发现和修复问题。 10....