全部学习汇总:GreyZhang/c_basic: little bits of c. ()
大学时候算是一个“吊车尾”,很多东西都只好在工作时候才开始慢慢掌握。刚刚开始工作的时候,看到宏编译开关都觉得很高大上。
最近在阅读一本英文版的数据结构与算法描述的书籍,其中有一点关于代码模块结构的描述。其中提到了宏编译开关的一点描述,文中比较形象的使用了inlude-sandwich结构来描述,并且强调每个头文件其实都应该带有这么一个include-sandwich的结构。
看《C专家编程》的时候了解到,从根本上来讲的化预处理其实不是c语言的语法或者特性,而是编译器的一种功能。也就是说,这其实是在编译正式启动之前需要完成的一部分工作。
很多时候,预处理中的红编译开关有点类似于if-else语言描述结构。使用这种技巧,可以减少编译器对文件的展开以及插入工作。一定程度上是为了提高速度,一定程度上也可以作为某种检查。
简单的例子:
test.h
#ifndef TEST_H
#define TEST_H
some code here.
#endif这样,如果是某个文件中没有包含test.h,编译器展开包含的头文件时就会实现整个文件的展开工作。如果在这之前展开过,那个TEST_H的宏就会被定义过,虽然被定义成了空白,#ifndef的预处理判断就会出现FALSE,整个条件预处理代码块中的其他信息就不会被处理。
通常,我个人使用的时候都是用来提升编译的速度。不过,接触别人代码的时候也常常发现别人把这种技巧用作代码块的切换,选择不同的宏定义来实现相应代码块的编译。
















