第十四章:预处理器
GitHub
链接:ch14. 预处理器
C
语言宏用的很多很多,看看 stdio.h
等各种头文件或者开源项目中的应用就懂了,各种宏定义,坑点也是蛮多的,需要学习并注意。
本章总结及注意点
部分课后习题解答
14.9 问题
-
以前竟然不知道…在
demo01.c
中把本章大大小小的点简单敲了敲。这 5 个宏确实蛮好用的。具体可见参考答案: -
见名知意。方便修改、维护。
-
考查
__FILE__
宏及__LINE__
的使用,以及参数转字符串的方法, 参数前加#
即可。见demo02.c
。 -
a. 3 2 3 b. 5 3 5 c. 2 4 20 d. 2 4 12。常规问题。
-
经常被调用,那么速度就是最重要的,使用函数开销大,所以使用宏定义来提高速度。
-
没看懂这个
process
是啥意思?这个目的是求数组中任一点到终点的后缀和?感觉答案说的不够清楚,有点牵强…参考答案: -
这个宏明显具有副作用了,这个依赖性非常危险,很容易造成越界情况,应该是数组元素为奇数的情况下就会产生越界情况。为啥要这样来求
sum
呢? -
没错。这种嵌套的定义有层数的限制,且在此不会到达这个层数限制。首先在此是有条件编译指令的,无论包含哪个文件,首先定义它自己的符号然后把另一个也包括进来。当它试图再次包含第一个时,整个文件被跳过。
-
sizeof()
在此不能作为一个常量表达式,其值是在预处理器完成后才工作计算的。另一种方法是使用limits.h
包含文件中定义的值。
14.10 编程练习
-
答案上的
# define OK 1
好骚气啊…为啥我的编译器自动缩进…简单的设计即可。见参考答案: -
#if
与#elif
的配合使用,最后补一个#else
即可。其实感觉和if-else
嵌套一毛一样啊。见demo03.c
。
随笔
P291-P292
中 #progma
这不知道是啥意思…我只见过 #pragma
和 #pragma once
哈哈。
宏在大的项目中是经常用到的,看到部分小的开源库、开源项目就各种的宏定义…这块知识不难,但是很显然,自己在课下练习的时候,代码量都比较少,宏用的都比较少,所以这块的知识还是需要留意的。
条件编译经常用来注释代码…用其来调试代码也是很不错的选择。
宏与函数的区别和优劣对比,重要:
疑问
-
P285 #undef
中说明名字需要被重新定义,要移除后再重新定义。其实可以编译过,但是在我这报一个警告。会以最新的定义将同名的宏覆盖掉。 -
预处理器符号。 5 个预处理器定义的符号,挺好用的,注意下就行了。
-
命令行定义有点秀,
-D
选项,就不需要自己进入代码中重复修改了。-Uname
会将程序中的name
的初始定义被忽略,一般结合条件编译使用。 -
条件编译的嵌套使用,用的太少了。
-
文件包含,与嵌套文件包含。
#pragma once
保证只声明一次。 -
#line
这个黑科技,用以修改__FILE__
及__LINE__