C和指针14章 预处理器
1.预定义符号:FILE进行编译的源文件名
LINE 文件当前的行号
DATE 文件编译的日期
TIME 文件被编译的时间
STDC如果编译器遵循ANSI C其值为1否则未定义
2.#define指令 #define name stuff
在文件中用stuff替换name,注意是单独的替换.所以有时会有些你意想不到的错误.注意
如果stuff是多行的话,那么每行的最后要加’\’
注意:你不应该在stuff后面加上分号.因为在调用的时候也会加一个分号,但是这里就出问题了.[两个分号]
宏与函数:
宏只是简单的替换,因此注意操作符的优先级.它的参数不管类型,这点很不错.宏里面用#value[value是参数]直接表示这个参数.##链接两个字符串.宏每次都会把代码加到相应位置,会加大代码量,如果宏的实现是比较长的,那么最好用函数[这个长是上面的stuff很长].注意宏的副作用.可能会出现你意料之外的事情.下面的宏:
#define EVENPARITY(ch) ((count_ont_bits(ch)1)?(ch)|PARITYBIT:(ch));
然后你通过下面的调用就有问题了.ch=EVENPARITY(getchar());//自己想,不会的可以留言
#undef移除一个宏定义,如果一个现存的名字需要重新定义,那么它的旧定义首先必须用#undef移除.
3.条件编译
#if constant-expression
statements
#elif constnt-expression
statements
#else
statements
#endif
上面的#elif可以多次出现[>=0]然后就相当于一般的if语句了.
是否被定义:
#if defined(symbol) #ifdef symbol//作用一样 是否已被定义
_#_if !defined(symbol) #ifndef symbol//是否没被定义
这些可以嵌套.
4.文件包含.包含库文件就直接用’<>’时间少点.包含本地文件用’ “ ‘.用’ “ ‘是首先从本地找,如果没找到再找库函数,’<>’是直接到库函数找.一个头文件如果被包含到10个源文件中,它实际上被编译了10次
可以嵌套包含,标准是编译器必须支持至少8层头文件嵌套.注意包含同一头文件多次的情况[不过这个暂时不知道为什么有错,是不是和编译器有关,我在本地试了下,没错 - -||,哪位看官知道的话,还请告知],下面的方法可以防止同一头文件被多次包含,就是在头文件里面加上一个
#ifndef _XXXX_H(这个名字随便你取)
#define _XXXX_H 1
/你的代码
/
#endif
5.其他指令:#error允许你生成错误信息.#line number “string”指定下一条指令(number是行数,string是文件名,string可以省略),这条指令会修改LINE FILE
#progma用于支持因编译器而异的特性,不过这个指令不可移植
提示:
1.避免用#define指令定义可以用函数实现的很长序列的代码
2.在那些对表达式求值的宏中,每个宏参数出现的地方应该加上括号,并且在整个宏定义的两边也加上括号
3.避免使用#define 宏创建一种新语言
4.采用命名约定,使程序员很容易看出某个标示符是否为#define宏[全大写]
5.只要合适就应该使用文件包含,不必担心它的额外开销
6.头文件只应该包含一组函数和(或)数据的申明
7.把不同集合的声明分离到不同的头文件中可以改善信息隐藏
8.嵌套的#include文件使我们很难判断源文件之间的依赖关系