带参数的宏和函数区别:

 宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。

示例1 用函数计算平方值。

#include <stdio.h>int SQ(int y){return ((y)*(y));
}int main(){int i=1;while(i<=5){printf("%d^2 = %d\n", (i-1), SQ(i++));}return 0;
}

运行结果:

1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16
5^2 = 25

示例2 用宏计算平方值。

#include <stdio.h>#define SQ(y) ((y)*(y))int main(){int i=1;while(i<=5){printf("%d^2 = %d\n", i, SQ(i++));}return 0;
}

在 Visual Studio 和 C-Free 下的运行结果(其它编译器的运行结果可能不同,这个++运算的顺序有关):

3^2 = 1
5^2 = 9
7^2 = 25

在示例1中,先把实参 i 传递给形参 y,然后再自增 1,这样每循环一次 i 的值增加 1,所以最终要循环 5 次。

在示例2中,宏调用只是简单的字符串替换,SQ(i++) 会被替换为 ((i++)*(i++)),这样每循环一次 i 的值增加 2,所以最终只循环 3 次。

宏和函数只是在形式上相似,本质上是完全不同的。

带参数的宏也可以用来定义多个语句,在宏调用时,把这些语句又替换到源程序中,请看下面的例子:

#include <stdio.h>
#define SSSV(s1, s2, s3, v) s1 = length * width; s2 = length * height; s3 = width * height; v = width * length * height;
int main(){int length = 3, width = 4, height = 5, sa, sb, sc, vv;SSSV(sa, sb, sc, vv);printf("sa=%d, sb=%d, sc=%d, vv=%d\n", sa, sb, sc, vv);return 0;
}

运行结果:

sa=12, sb=15, sc=20, vv=60

C语言带参宏定义和函数的区别相关推荐

  1. 【C语言】宏定义和带参宏定义

    宏定义是在编程中经常使用的一个模块,其优点在于当写的代码量比较大的时候方便修改检查,可以做到改一变"百". 一.宏定义 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏 ...

  2. 带参宏定义和带参函数的区别

    在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型.而在宏调用中,实参包含了具体的数据,要用它们去代换形参,因此必须指明数据类型. 这一点和函数是不同的:在函数中,形参和实参是两个不同的变量 ...

  3. 宏定义(无参宏定义和带参宏定义)

    宏定义是比较常用的预处理指令,即使用"标识符"来表示"替换列表"中的内容.标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中 ...

  4. C语言中宏定义和函数的区别

    前言 在C语言中,对于一些常用或通用的代码段的封装可以有两种方式:函数和宏定义. 这篇博客就来带大家梳理一下对于这两种方式我们在使用时应该如何抉择,以及它们的区别和优缺点. 宏定义和函数的区别 从程序 ...

  5. C语言 带参数宏定义中 # 和 ## 知识点总结、代码分析

    目录 一.宏定义中 "#"知识点 1.直接转换字符串,不展开. 2.转换出的结果一定是"字符串". 二.宏定义中 ## 知识点 1.应用场景 2."# ...

  6. C语言【宏定义与函数的区别】

    在代码开发过程中,有一些常用或者可以通用的功能或者代码段,实现这些功能,既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 先看宏 宏: #de ...

  7. 4.6宏定义之带参宏

    //本文为转载,具体出处已经找不到了.这里引用为了知识传播.感谢原作者. C语言允许宏带有参数.在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似.就像把函数的实参传递给形 ...

  8. 05c语言——宏定义、带参宏、带参宏函数

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.宏定义 1.使用规则 2.注意 二.带参宏 1.定义 2.注意 三.带参函数 1.带参函数的宏与带参宏的区别 2.带参宏 ...

  9. 带参宏和带参函数的比较(C语言)

    例:分别通过宏定义和函数方式求a和b的乘积 #include<stdio.h> #define mult_macro(a,b) a*b int mult_fun(int a, int b) ...

最新文章

  1. P1494 小Z的袜子
  2. python玩王者荣耀皮肤_利用Python完成对王者荣耀英雄全皮肤的下载
  3. 小游戏_猜数_JAVA
  4. python实现redis分布式锁
  5. android自定义控件 几种方式总结
  6. 创建存储,修改存储_安全地创建和存储密码
  7. Mac OS 看机起动JIRA
  8. 高速路上车辆组队链接的想法
  9. Windows下修改hosts文件
  10. 计算机启动dos,开机怎么进入dos_开机怎么进入dos界面
  11. 安卓蓝牙BluetoothBLE开发JDY-10M
  12. K线技术指标实现详解—MA
  13. 嵌入式软件工程师学习规划
  14. 一个具有多个组件的在线平面图设计 平面图 在线制图
  15. Ubuntu 22.04 ‘Jammy Jellyfish‘ 的新功能
  16. uniapp引用外部js_Uniapp怎么引入外部js
  17. 网站怎么备案?如何快速通过网站备案?网站快速备案攻略请查收!
  18. 如何查看公众帐号粉丝的微信号
  19. java 字符串模糊匹配
  20. SAP 从入门到放弃系列之安全库存

热门文章

  1. U盘装win7系统出现question(1808)的原因与解决方法
  2. 【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用
  3. mvn install:install-file将本地一个中央仓库没有的jar包,推到本地仓库----所有依赖不上仓库不能用
  4. JAVA中基本类型Boolean占几个字节
  5. linux shell文件锁,shell脚本实现文件锁功能
  6. java编写流星_纯Java代码实现流星划过天空
  7. linux mysql 备份脚本_linux 之mysql备份脚本
  8. java 数字组合_java解决数字组合问题
  9. gitlab ci 配置 java_GitLab CI/CD 配置
  10. tt协议号服务器,TTIot: TTIoT云端物联网Iot组件;面向JAVA;netty;mqtt;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...