一,宏定义的基本用法
1,简单的宏定义
#define <宏名> <字符串>
例:#define PI 3.1415926
2,带参数的宏定义
#define <宏名> (<参数表>) <宏体>
例: #define sum(a, b) (a)+(b)
二,使用#define带来的问题
例如有下面这个宏定义:
#define MAX_VAL 1.234
名称MAX_VAL从未被编译器看到过,因为在编译器处理源代码之前,它就被预处理器移走了。因此,MAX_VAL有可能没进入符号表内,当我们使用这个常量获取一个编译错误信息时,可能会带来困惑,因为这个错误信息也许会提到1.234但不是MAX_VAL。因此我们要以编译器来替换预处理器,或许#define不被视为语言的一部分。
三,使用const或enum来替换#define
例如有下面的常量定义:
const int numSize = 20;
作为一个语言常量,numSize肯定会被语言看到,当然也就会进入符号表内。
四,使用inline函数替换#define
例如:
#define sum(a, b) a+b
使用宏定义的函数,看起来像函数,但是它的调用与普通的函数调用机制是不相同的。宏定义的函数,这并不是真正的函数,调用函数时没有参数传递,只是简单的使用宏名替换宏体,进行简单的文本替换,并不像普通的函数调用那样有一个参数传递的过程。应当使用下面的函数定义,取代上面的宏定义:
inline int sum(int a, int b){
return a + b;
}