当前位置: 首页 > news >正文

宏定义和函数调用的区别

  1. 定义方式
    • 宏定义:使用#define预处理指令来定义。它只是简单的文本替换,在预处理阶段完成。例如,定义一个求两个数最大值的宏:
      #define MAX(a,b) ((a) > (b)? (a) : (b))
  • 函数调用:函数需要先进行声明(可以在头文件中声明),然后在源文件中进行定义。例如:
int max(int a, int b)
{return a > b? a : b;
}

并且在使用函数的地方进行调用,如int result = max(3, 5);
2. 执行时机

  • 宏定义:在预处理阶段,编译器会将宏定义的代码进行文本替换。例如,对于MAX(3, 5),编译器会将其替换为((3)>(5)?(3):(5)),这个替换过程是在编译之前完成的。
  • 函数调用:函数调用是在程序运行时执行的。当执行到函数调用语句时,程序会跳转到函数定义的地方,执行函数体中的代码,然后返回结果。例如,当执行int result = max(3, 5);时,程序会暂停当前的执行流程,跳转到max函数的定义处,计算35的最大值,然后将结果返回给result,并继续执行后续的代码。
  1. 参数类型检查
    • 宏定义:没有参数类型检查。因为它只是简单的文本替换,宏定义中的参数可以是任何合法的表达式。例如,MAX(3 + 2, 4)会被替换为((3 + 2)>(4)?(3 + 2):(4)),不会检查参数的类型是否符合要求。
    • 函数调用:函数有严格的参数类型检查。在 C 和 C++ 中,函数声明中指定了参数的类型,如果传递的参数类型不匹配,编译器会发出警告或错误。例如,如果有一个函数void printInt(int num),而调用时使用printInt("hello");,编译器会提示类型不匹配的错误。
  2. 返回值机制
    • 宏定义:宏定义本身没有返回值的概念,它只是通过表达式计算出一个结果。例如,MAX(3, 5)计算出的结果5会直接替换宏调用的位置。
    • 函数调用:函数通过return语句返回一个值。这个值可以是基本数据类型,也可以是指针、结构体等复杂类型。函数的返回值类型在函数声明和定义时就已经确定,并且返回值会被传递回调用函数的地方。例如,max函数通过return a>b? a : b;返回ab中的最大值。
  3. 代码大小和执行效率
    • 宏定义:由于宏定义是文本替换,可能会导致代码膨胀。如果一个宏在多处被调用,那么每次调用的地方都会进行文本替换,生成相应的代码。但是,它没有函数调用的开销(如函数调用时的栈操作等),执行效率可能会更高。例如,在一个循环中频繁调用宏定义来进行简单计算,可能会使代码体积变大,但执行速度可能会比函数调用快。
    • 函数调用:函数调用会有一定的开销,包括函数调用时的栈帧建立和销毁、参数传递等操作。但是,函数代码只需要在内存中存储一份,不会像宏定义那样导致代码膨胀。所以,对于代码体积来说,函数调用更有优势,但对于频繁调用的简单操作,执行效率可能不如宏定义。
  4. 作用域
    • 宏定义:宏定义的作用域是从定义处开始,到文件末尾结束,除非被#undef指令取消定义。它不受函数作用域的限制,在整个文件范围内都可以进行替换。
    • 函数调用:函数有自己的作用域。函数内部定义的变量只在函数内部有效,函数外部无法访问。函数的作用域规则有助于封装数据和实现模块化编程。


http://www.mrgr.cn/news/69310.html

相关文章:

  • Go语言的零值可用性:优势与限制
  • 从零创建vue+elementui+sass+three.js项目
  • 我与Linux的爱恋:进程间通信 匿名管道
  • 实现金蝶云与MySQL的无缝数据集成
  • P1197 星球大战(并查集+逆向思维)
  • Python爬虫----python爬虫基础
  • 「C/C++」C++标准库 之 #include<exception> 异常处理库
  • web实操2——idea创建普通web项目
  • 柯桥学日语J.TEST考试是什么?J.TEST考试报名
  • mysql 几种启动和关闭mysql方法介绍
  • C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数
  • C语言--结构体的大小与内存对齐,位段详解
  • Pytorch实现运动鞋识别
  • ES6之Proxy详解
  • 【设计模式】行为型模式(一):模板方法模式、观察者模式
  • 详解:光伏电站前期收资
  • 浮动路由:实现出口线路的负载均衡冗余备份。
  • C转DP线 单向 双向选择
  • 软考错题分析1109
  • QJson-趟过的各种坑(先坑后用法)
  • react的创建与书写
  • Java 的 Scanner 类:控制台输入与文件扫描
  • 第 1 章 - Go语言简介
  • 软考:论容器编排
  • 介绍一下数组(c基础)(详细版)
  • 2024年3月电子学会Python等级考试试卷(五级)真题,包含答案