经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言中#define定义的标识符和宏实例代码
来源:jb51  时间:2022/3/7 12:37:08  对本文有异议

??1.#define定义标识符

在C语言程序中,有时候会包含#define

#define可以定义标识符

也就是说可以对字符重新定义,实现代替的作用

??语法

#define  name  stuff 

就比如说:

#define MAX 1000(用MAX代替1000)

#define reg   register (用reg代替register)

??举个栗子

  1. #include<stdio.h>
  2. #define MAX 100
  3. int main()
  4. {
  5. printf("%d", MAX);
  6. return 0;
  7. }

当代码运行的时候

在代码编译的预处理阶段 就会把宏替换为文本程序代码

代替的结果如下:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. printf("%d", 100);
  5. return 0;
  6. }

??注意:#define定义标识符后面尽量不加上分号,因为如果加上的话,在替换的过程中,分号也会别替换到文本程序中,有时候会导致出现逻辑错误。

??2.#define定义宏

#define规定允许将参数替换到文本中,这样包含参数叫做#define定义宏

宏在程序中,执行的速度更快,因为相对于函数,宏没有函数的调用和返回的开销

语法:
#define SQUARE(x)   x*x

这与#define定义宏一样,都是完成替换的,不过#define定义宏后面有一个括号,包含参数

??下面用#define定义宏来实现两个数求最大值

  1. #include<stdio.h>
  2. #define MAX(x,y) ((x)>(y)?(x):(y))
  3. int main()
  4. {
  5. int a = 20;
  6. int b = 10;
  7. int c = MAX(a,b);
  8. printf("%d", c);
  9. return 0;
  10. }

替换后的结果为:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a = 20;
  5. int b = 10;
  6. int c = a>b?a:b;
  7. printf("%d", c);
  8. return 0;
  9. }

 在#define定义宏的时候,后面的参数尽量带上括号,使每一个参数相对独立

这样可以避免由于操作符的优先级不同,导致最终的逻辑就错了

举个栗子:

  1. #include<stdio.h>
  2. #define sum(x) x*x
  3. int main()
  4. {
  5. int ret = sum(3 + 3);
  6. printf("%d", ret);
  7. }

如果不仔细观察的话,可能你认为的结果就是36

这个代码的计算过程为:3+3*3+3,并不是(3+3)*(3+3)

??#define替换的规则

#define定义标识符和宏时,程序会继续如下步骤

1.在定义宏时,先对参数进行检查,如果参数里包含有#define定义的标识符时,首先完成相应的替换

 

2.替换文本会随后插入到原来文本文件中,对于宏来说,参数名被他们的值所替换

 

3.最后进行检查,果然还有#define定义的符号,将重复上述的操作

 注意:

1.#define参数中可以包含其他由#define定义的标识符,但是#define不能递归

2.如果#define的参数名存在在字符串中,将不会完成替换

??#与## #的用法:

在不确定参数的情况下,可以使用 “#n” ,可以实现不同字符串的插入

效果如下:

  1. #include<stdio.h>
  2. #define PRINT(n) printf("the value of "#n" is %d\n",n);
  3. int main()
  4. {
  5. int a = 10;
  6. PRINT(a);
  7. int b = 20;
  8. PRINT(b);
  9. int c= 30;
  10. PRINT(c);
  11. return 0;
  12. }

??替换后的效果为:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a = 10;
  5. printf("the value of" "a" " is %d\n",a);
  6. PRINT(a);
  7. int b = 20;
  8. PRINT(b);
  9. printf("the value of " "b" " is %d\n",b);
  10. int c= 30;
  11. PRINT(c);
  12. printf("the value of " "c" " is %d\n",c);
  13. return 0;
  14. }

##的用法:

  1. #include<stdio.h>
  2. #define CAT(Max,num) Max##nu
  3. int main()
  4. {
  5. int Maxnum = 100;
  6. printf("%d", Maxnum);
  7. return 0;
  8. }

双##的用法可以拼接两个字符串

当然这个前提是拼接后的字符串必须产生一个合法的标识符,否则结果就是未定义的

??宏的缺点

 1.如果使用宏过多,宏定义的代码插入到程序中,会大幅度增加程序的长度

2.宏是没法调试的

3.宏与类型无关,导致程序不够严谨

4.宏会带来优先级的问题,容易导致程序的错误

 ??宏和函数的优缺点      

1).在代码长度角度上,因为宏是直接替换所以若宏较长会增加代码长度

2).在执行速度上,宏较函数快,因为函数存在调用/返回时的额外开销

3).在参数求值方面,define定义的宏可能会具有副作用会导致修改变量最后的值,而函数即使调用多次也不会修改变量原来的值

4).在参数类型方面,宏与类型无关,所以宏是可以传参数的而函数不行在C中函数是不可以传类型的

 5).在是否可调试方面,宏不可调试,函数可调试宏可以传类型的检测,实现malloc(动态开辟内存的函数)

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MALLOC(COUNT,TYPE) (TYPE *)alloc(COUNT*sizeof(TYPE))
  4. void *alloc(int sz) //宏可以传类型,函数不可以传类型
  5. {
  6. void *p=malloc(sz);
  7. if(p == NULL)
  8. {
  9. printf("out of memory\n");
  10. exit(EXIT_FAILURE);
  11. }
  12. return p;
  13. }
  14. int main()
  15. {
  16. int i=0;
  17. int *p=MALLOC(10,int);
  18. for(i=0;i<10;i++)
  19. {
  20. *(p+i)=i;
  21. }
  22. for(i=0;i<10;i++)
  23. {
  24. printf("%d ",*(p+i));
  25. }
  26. free(p);
  27. system("pause");
  28. return 0;
  29. }

总结

到此这篇关于C语言中#define定义的标识符和宏的文章就介绍到这了,更多相关C语言#define定义标识符和宏内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号