1、无参宏定义
形式为:#define 宏名 字符串
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。
例如: #define M (a+b) 在编写源程序时,原先要写的所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。
#include <stdio.h>
#define M (a+b)
...
{...
int s;
s=M*M;
...}
其中的s=M*M 在编译之前M被替换成"(a+b)",就变成 s=(a+b)*(a+b).括号同样替换。
需要注意几点:1.宏只是简单替换,并不做任何检查,如有错误只能在编译已被宏展开后的源程序发现。
2.宏定义不是说明或者语句,末行不用加分号。如果加分号就会连分号一起替换
3.宏定义必须写在函数之外,作用域为从运行到#define开始 至全局程序结束或者#undef位置
2
、带参宏定义
形式为: #define 宏名(形参表) 字符串
比如:
#define M(y) ((y)*(y)+3*(y))
k=M(5); /*宏调用*/
当程序中出现M(数据)时,就替换。记住是替换而不是掉用。(跟函数区别)
//----------------------
#define MAX(a,b) (a>b)?a:b
具体说明,跟无参的宏定义类似
3、条件编译
条件编译这才是我们今天要学习的重点。这会与#define #ifdef # ifndef挂钩.
一般情况下,源程序中所以的代码都要进行编译,但是有时候由于嵌套了太多的头文件(.h文件),而头文件中又可能包含相同的类,变量等等。需要编译的时候,就会重复。影响效率不说,还会报错。
#ifdef XXX…(#else) …#endif
例如
例如
#ifdef DV22_AUX_INPUT
1......
1......
#else
2.....
#endif 它的作用是:如果DV22_AUX_INPUT定义了且DV22_AUX_INPUT,就执行1处的代码,如果没定义就执行2处的代码。这里要有个问题很困扰过我,我做这篇文章也是因为这个问题。就是 DV22_AUX_INPUT什么时候定义的,对,我们可以在代码的前面自己定义。比如我们定义 #define DV22_AUX_INPUT 这样程序执行的时候就会执行1处的代码了。如果我们没有定义 #define DV22_AUX_INPUT 或者#define DV22_AUX_INPUT 0 这样就会执行2处的代码了。
2.....
#endif 它的作用是:如果DV22_AUX_INPUT定义了且DV22_AUX_INPUT,就执行1处的代码,如果没定义就执行2处的代码。这里要有个问题很困扰过我,我做这篇文章也是因为这个问题。就是 DV22_AUX_INPUT什么时候定义的,对,我们可以在代码的前面自己定义。比如我们定义 #define DV22_AUX_INPUT 这样程序执行的时候就会执行1处的代码了。如果我们没有定义 #define DV22_AUX_INPUT 或者#define DV22_AUX_INPUT 0 这样就会执行2处的代码了。