在执行一个程序之前,我们会有程序的翻译,也就是将代码翻译成可供机器识别的机器语言(也就是二进制),将程序变成目标文件才到了程序的执行。翻译和执行也叫翻译环境和执行环境。(翻译环境包括了代码的预处理、代码编译以及代码的汇编)而下面要说的是在翻译环境中的预处理操作的内容。
预定义符号:
__FILE__:进行编译的源文件。
__LINE__:文件当前行号。
__DATE__:文件编译的日期。
__TIME__:文件被编译的时间。
上面这四个预定义符号是语言内置的,下面是例子:
#define:
作为标识符,#define可以根据使用者需求定义一些名字然后进行赋值,在程序预处理的时候会将自己定义的名字所含有的值替换进所引用的地方,例如用#define来定义MAX的值为100
再使用MAX:
然后b就等价于:
注意这里#define定义MAX的语句后面不能加“;”号,否则也会替换过去。
就如图所示就会发生两个分号“;”的错误。
#define作为宏
当#define作为宏的时候可以类似函数那样发挥作用
格式:#define XXX(n) x*x
注意
1 作为宏的时侯,括号要紧贴name,也就是XXX与(n)要紧贴,不能是”XXX (n)x*x“,只能是“XXX(n) x*x”不然括号以及里面的未知数会被认为是和后面的运算是一起的。
2 define定义的名字在常量字符串出现的时候,编译器在翻译的时候不发生替换,例如在用函数printf()的时候,括号里面的双引号里面放了所定义的宏的话是不进行替换的。
接下来是使用例子:
首先我们用#define定义宏 ADD
在这里很容易犯错的是此时如果将ADD里面的x+y作为一个整体先相加,会得到3+4=7,然后再乘2得到14,但是其实在程序翻译的时候,预处理指令会先将ADD里面的预指令先替换进代码,那么就变成了2*3+4=10,而不是2*(3+4)=14,所以最后的答案是10而不是14。
那么我们要如何使2*3+4变成2*(3+4)呢?
很简单,在定义的时候加上一个括号就行:
注意:
宏不像函数,不能进行递归。
下面是宏和函数的对比:
宏的优点:
1:宏相比于函数一般来说所占用的代码长度短。
2:宏相比于函数一般来说执行速度更快。
宏的缺点:
1:宏使用的时候需要考虑优先级,有时候需要用括号来提高优先级,防止出错,而函数则不需要。
2:宏如果在代码的多个地方出现进行参数求值的时候可能会产生不可预料的后果。
#undef
该指令的作用是使#define所定义的宏失效。