Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
#define的使用方法_define后面跟的一个函数,希望能够帮助你!!!。
#define 多数情况下我们是用来定义宏的,但是实际上,#define 作为预处理指令,也可以用来定义标识符,类似于 typedef,但是其本质和 typedef 是不同的。
目录
一、#define 定义标识符
1、定义和使用
2、#define 定义标识符 和 typedef 定义别名的区别
二、#define 定义宏
1、无参
2、有参
3、宏和函数的比较
(1) 宏的优点
(2) 宏的缺点
#define 的本质是替换,将前者替换为后者,比如如果代码中使用了 reg,在预处理阶段,reg 就会被替换为register。
#define reg register //为 register这个关键字,创建一个简短的名字 #define do_forever for(;;) //用更形象的符号来替换一种实现 #define CASE break;case //在写case语句的时候自动把 break写上。 // 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。 #define DEBUG_PRINT printf("file:%s\tline:%d\t \ date:%s\ttime:%s\n" ,\ __FILE__,__LINE__ , \ __DATE__,__TIME__ )
以下面这个例子为例,p1、p2、p3、p4分别是什么类型??
#define ptr_t int* typedef int* ptr_t2; int main() { ptr_t p1, p2; ptr_t2 p3, p4; return 0; }
宏的本质是替换,预处理阶段会被替换成如下状态。此时 * 会优先和离自己近的变量名结合,因此p1 是 int* 型指针,而 p2 是普通的 int 型变量。
int* p1, p2; //int *p1, p2;
但是typedef 是起一个别名,即便是换成了ptr_t2 ,ptr_t2不会替换,而是一种实打实的类型,此时p3、p4都是 int* 型,因此,p3、p4都是int* 型指针。
根据有无参数列表,宏的定义方式可以分为无参和有参。
无参的声明可以参考下面的例子。宏的本质是替换,所以宏是
#define reg register // 定义标识符 #define MAX 100 // MAX 是宏的名字,100 是 MAX 对应的值
#define MAX 100 int main(){ int a = MAX; // 预处理阶段,这行代码会变成 int a = 100; return 0; }
注意 :宏的本质是替换,在预处理阶段,宏的名字会被替换成对应的值,因此在声明宏的时候不能出现分号 ';',如果出现了分号就变成下面这样
有参就涉及到参数传递了,此时需要记住:传递参数的时候,表达式不参与任何运算。宏的本质依然是替换,此时的步骤是:先传参,后替换
就像函数一样,宏会接收传递给自己的参数,但是本质是不一样的
#define ADD(X,Y) X+Y // 不推荐,这样做只是方便理解,建议带小括号 //#define ADD(X,Y) ((X) + (Y)) // 推荐
#define ADD(X,Y) X+Y int main() { int a = ADD(10, 20); // 就像调用函数一样,会进行参数传递 // 但本质是替换,预处理阶段会被替换成 // int a = 10 + 20; return 0; }
注意:宏的本质是替换,即便有参数,也是先传递参数,再进行替换
在定义的时候也提到了,表达式的每个变量建议加上小括号。以下面这个例子为例,本来的目的是求一个数的平方,但是实际上的结果并非如此。
#define SQUARE(X) X*X // 求平方 int main() { int a = 5; int b = SQUARE(a + 1); printf("%d\n", b); return 0; }
宏存在参数传递的时候,表达式不会参与任何运算,所以这里是直接把 5 + 1 传递给了宏
然后是替换,此时原本的宏就会被替换为
最终得到的结果是 11,为了避免这样的情况,当宏存在表达式的计算时,表达式的每一项建立带上小括号,就像下面这样
#define SQUARE(X) ((X)*(X)) // 求平方
宏通常被应用于执行简单的运算。函数可以参数传递,宏也可以参数传递,那么两者有什么区别呢?
a. 程序规模和调用速度
宏在预处理阶段就被处理了,但是函数要先经过编译、汇编等过程生成符号表才能用于后续的调用,而且函数需要有函数名、函数体。如果仅仅只是简单的功能实现,无论是调用速度还是程序规模,宏都是更胜一筹。
比如获取两个数的较大值:
#define MAX(a, b) ((a)>(b)?(a):(b))
b. 宏与类型无关
函数参数必须要声明指定类型,在没有泛型的情况下,不同类型的处理可能需要定义多个函数,但是宏与类型无关,以比较大小为例,如果只是整型家族的比较,使用宏就足矣。
宏的缺点也比较直接明了:
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章