一,预定义符号
C语言设置了一些预定义的符号,可以直接拿来使用,预定义的符号也是在与处理期间处理的。
二,#define
#define:机制包括一个规定,允许把参数替换到文本中,这种通常称为宏。
注意:参数列表的左括号必须与name紧邻,如果两者之间有任何的空白存在,参数的列表就会被解释为stuff的一部分
提示:所以用来对数值表达式进行求值的宏定义都应该加上括号,避免使用宏的时候由于参数中的操作符他们运算优先级从而输出了错误值
不加括号:
加括号:
三,带有副作用的宏参数
当宏的参数在宏的定义中出现过一次的时候,如果参数带有副作用,那你在使用宏尚未时候就可能出现危险,导致不可测的危险。
四,宏的替换规则
(1)在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果有,首先被替换。
(2)替换文本随后被插入到程序中原来为本的位置。对于宏,参数名被他们的值替换。
(3)最后,再次对文件进行扫描,看看他是否包含#define,如果有,就重复以上步骤。
注意:
(1)宏参数和#define定义中可以出现其他#difine定义的符号,但是,对于宏来说,不能出现递归。
(2)当处理器搜索#define定义的符号的时候,字符串的常量并不会被搜索。
五,宏与函数的对比
宏通常用来执行简单的运算。
(1)调用函数和函数的返回可能比实际执行的时间要长。所以,宏在时间方面更胜一筹。
(2)更为重要的是函数的参数要生命特定的类型。宏的参数是与类型无关的。
宏的劣势
(1)每次使用宏的时候,一份宏的定义代码插入到程序中,除非宏比较短,不然会大幅度增加程序。
(2)宏是无法调试的。
(3)宏由于与类型无关,也就不够严谨。
(4)宏可能会带来运算符优先级的问题。
五,#和##
#运算符将宏定义的参数转换为字符串的字面量。可以理解为“字符串的转换”。
##运算符可以把两边的符号合成一个符号,它允许宏定义从分离的文本判断创建标识符。