#define通常有以下几方面用途:
1. 定义常量
类似于java的static final 以及 c++的const。不过通过#define定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
语法:
#define 标识符 常量
示例:
#define PI 3.14
定义常量有什么好处呢,就是如果常量的值发生变化的时候,我们不需要到各个使用的地方去修改这个值,只需要在定义的地方修改一次就好了。
2. 定义函数
这里与其说是定义函数,不如说是定义字符串常量。其实就是用一个符号名来替代一行或多行函数语句,在实际编译的过程中再用实际的函数语句去替换符号名。
在#define定义函数的时候并不会检查报错,因为对define来说,就是定义一串字符串嘛,所以不存在错误一说。在实际使用这段定义的函数中是否会出错,直接把这段函数拷贝到使用处看看就知道了。
2.1 单行函数举例
如下,我定义了MAX(a, b)和PRINT_HELLO(a)两个函数。
#define MAX(a,b) a > b ? a : b
#define PRINT_HELLO(a) printf("hello %s\n", a)
int main(int argc, char *argv[])
{
// 输出最大值2。如果想知道这里能不能用上面两个函数,直接把其对应的字符串拷贝过来
// 很明显, PRINT_HELLO(a)拷贝过来之后就变成了 printf("%d\n", printf("hello %s\n", a) ); 这明显是错误的
printf("%d\n", MAX(1, 2));
// 输出hello world
PRINT_HELLO("world");
}
2.2 多行函数举例
在定义多行函数的时候,可以把多行函数写在一行,也可以用换行符写在多行。
#define PRINT_HELLO(a) { printf("hello %s\n", a);printf("input param is %s\n", a);}
#define PRINT_HELLO_MULTI(a) { \
printf("hello %s\n", a); \
printf("input param is %s\n", a); \
}
int main(int argc, char *argv[]){
printf("%d\n", MAX(1, 2));
PRINT_HELLO("world");
PRINT_HELLO("world");
}
3. 特殊语法##和#
#define中支持拼接变量。如下,Conn(str)的结果是MyName在拼上变量str
#define Conn(str) MyName##str
#是用来取宏定义中传入的变量的。
#define Conn(a) void plusFunc() { printf("%s\n", #a); }
// 把Conn代表的字符串替换到这里就能看出来,这里其实相当于定义了一个函数plusFunc
Conn(abc);
int main()
{
// 这里调用刚才创建的函数
plusFunc();
return0;
}
网友评论