在编写c文件时,我们都喜欢用宏来定义一些常量或者函数,这样增加了程序的可读性!但是我们有没有想过使用宏定义时可能出现问题呢?下面就简单举几例来说明宏定义的弊端!

例1:

#define jia(m,n)    (a)+(b)

printf("%d\n",jia(1,2)*jia(1,2));

通常我们以为结果是9,但是编译出来的结果却是5,因为宏定义只是简单的替换,并没有执行这个函数,所以替换的结果表达式是1+1*2+2。其实我们只要这样写((a)+(b)),就就可以避免这样的错误出现。

例2:

#define jia(m,n)   (a<b)?a:b

i=1;j=5;

printf("%d\n",jia(i++,j));

正常情况下,我们希望的结果是1,但是编译过后呢,通过预编译指令,我们知道这些宏被替代后的表达式是:(i++<j)?i++:j;这样在输出的时候i++就执行了一次++了,也就是说i变成2了,而不是1了,所以我们在宏定义函数的时候不要给表达式,不然会出错的。

当然宏定义也有它的好处,所以用的时候注意情形就可以了。它只是简单的替换,所以在写宏定义的时候没有什么特殊的语法规定,如:#define pata_1 "D:\depli\c\3.ppt"

#define pata_2 D:\depli\c\3.ppt

上面两种写法在编译的时候是能通过的,即使你的\没有,也可以,所以宏定义就是简单的替换!

转载于:https://www.cnblogs.com/152-sun/p/3217342.html

c语言中定义宏的利与弊相关推荐

  1. C语言使用define定义圆周率,C语言中的宏处理

    在C语言中使用宏,我们经常这么做,但是为什么使用宏,他可以做什么,我们或许只是一知半解,下面简单介绍如何在C语言中使用宏预处理器. #define语句 对于define语句,我们已经非常熟悉,一个宏定 ...

  2. c语言中定义pi为一个符号常量,将π的值定义为符号常量PI

    编程序计算圆的面积和球的体积.要求圆或球的半径在程序中赋值.圆周率定义为符号常量. 编程语言有多种,你需要哪一种?pascal,ForTran,ada,C,C++,C#,delphi或者Java?给你 ...

  3. 怎样设置一个函数C语言,C语言中怎样编写一个函数 如何在C语言中定义一个函数?...

    如何在C语言中定义一个函数?小编很想在你面前流泪最后却还是选择装作打个哈欠 为什么小编怎么定义函数都不正确呢? 总是说小编 表达语法错误在main函数中 小编们可以在头文件与main函数之间定义,并编 ...

  4. c语言 引用定义变量,如何在c语言中定义及引用全局变量?

    如何在c语言中定义及引用全局变量? 答案:5  信息版本:手机版 解决时间 2019-10-03 10:30 已解决 2019-10-02 15:19 如何在c语言中定义及引用全局变量? 最佳答案 2 ...

  5. C语言中的宏函数与宏定义

    目录 1.无参宏定义 1.1 无参数宏定义的格式: 1.2 使用说明: 2.带参宏定义 2.1 带参数宏定义的格式: 2.2 使用说明: 3.带参宏定义与函数调用的区别 4.头文件中常用的宏定义 5. ...

  6. C语言中关于宏定义的学习

    1.C语言中宏定义的使用 2.GCC官方文档 3.C语言宏定义的几个坑和特殊用法 转载于:https://www.cnblogs.com/Brandon0807/p/11146344.html

  7. c语言中关于宏和内联说法正确的是, 2011年1月高等教育自学考试全国统一命题考试 C++程序设计试题...

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  8. c语言通过定义变量实现对,C语言中定义变量“#X”,X##, ##X 和“##X##”用意

    关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.比如下面代码中的宏: 1. ...

  9. 关于C语言中的宏的一点点讨论

    前言: 熟悉C语言的朋友应该对宏不陌生, 宏在C语言程序开发中是经常使用的,使用其的主要目的是方便程序员的编程工作,并且能在一定程度上提高程序的效率.C语言中提供的宏定义命令是#define.下面就使 ...

最新文章

  1. JIT Code Generation代码生成
  2. go标准命令详解0.2 go install
  3. python规范化字符串_python中正确的字符串编码规范
  4. 如何避免fstab挂载故障问题
  5. java c 语言之父_Java之父评价C语言之父:他是一位天才,c语言撑起了一切
  6. 程序员最喜欢说的十句话,看看你最喜欢说哪句?
  7. word List 14
  8. 抽取大小: 高斯sigma_无服务器:SLAppForge Sigma入门
  9. oracle mysql 线程数_oracle线程数更改
  10. oracle主键从键怎么看,分析Oracle主键的跳号现象
  11. python数字运算程序_python03 一些简单的数字运算
  12. centos6.5 mysql忘记登入密码
  13. 【论文】清华九歌作诗系统
  14. 【工作记录】SpringMVC下js提交大数据量到controller失败解决
  15. canvas-缤纷小球
  16. Stata | 缺失值处理标签
  17. oracle 裸设备使用方法,Linux上如何使用裸设备
  18. 具有改善视力作用的食物
  19. 微信公众号开发~有感而发
  20. SEO零基础入门教程(外链的发布和软文编写)

热门文章

  1. 克罗谈投资策略02_赢家和输家
  2. CTA策略06_BollChannelStrategy
  3. 回测引擎代码分析流程图
  4. mongodb性能 mysql_MySQL和MongoDB的性能测试
  5. 移动端报表JS开发示例
  6. 友商对于鸿蒙系统,谷歌新系统上线!鸿蒙面临生死线考验,华为喊话友商,被小米拒绝...
  7. matlab 索力迭代,索梁组合体系桥梁施工索力确定的割线迭代法
  8. 饱和气压与温度的关系_气压和钓鱼的关系,冬天钓鱼还需要看气压吗?很多钓友都错了...
  9. ceq c matlab,求一个函数MATLAB的编程,求大神指教。
  10. oracle 用户创建日期,oracle限制一个用户空闲时间