目录

一、不带参数的宏定义

1.定义

2.#undef 指令取消宏定义

二、带参数的宏定义

1.定义

2.宏定义参数替换的注意事项

三、带参数的宏定义和带参函数的区别


一、不带参数的宏定义

1.定义

在程序中,经常会定义一些常量,例如圆周率3.1415、“ABC”等。如果这些常量在程序中频繁使用,难免会出现书写错误的情况。为了避免程序书写错误,可以使用不带参数的宏定义来定义这些常量。

例如:#define PI 3.14159

解析:#define是用来标识一个宏定义,标识符PI是定义的宏名,3.14159是宏体,它可以是常量或表达式等。

一般情况下,宏定义需要放在源程序的开头,函数定义外,它的有效范围是从宏定义语句开始至源文件结束。一般宏名都是大写字母,方便与其他操作符区别。

使用宏定义PI就可以在随后的源代码中出现PI的位置替换为3.14159.

案例演示:

#include <stdio.h>
#define PI 3.141592int main(){int r;scanf("%d",&r);double area=PI*r*r;double cicle=2*PI*r;printf("半径为%d的圆面积:area=%lf  周长cicle=%lf\n",r,area,cicle);
} 

运行结果:

2.#undef 指令取消宏定义

#undef指令用于取消宏定义,当使用#define定义了一个宏之后,如果预处理在接下来的源代码中看到#undef指令,那么#undef指令后面这个宏就会失效。


二、带参数的宏定义

1.定义

带参数的宏定义,其语法格式如下:

#define 标识符(形参列表)字符串

形参列表中的参数之间用逗号进行分隔。对于带参数的宏定义来说,同样需要使用字符串替换宏名,使用实参替换形参。

由于宏定义在程序预处理的时候执行,因此,相对于函数来说,宏定义的开销要小一些。

【注意】宏定义中的参数替换是“整体替换”。

实例分析:

#define ABS(x)((x)>=0?(X):-(X);

int a=12;

ABS(++a);

我们期望的值是12,但实际a的结果为14,显然这个用来替代求绝对值函数是错误的。

原因是在进行预处理时“ABS(++a)”替换为“(++a)((++a)>=0?(++a):-(++a);”,所以结果为14

案例实现:

#include <stdio.h>
#define SWAP(a,b) {int temp;temp=a;a=b;b=temp;}int main() {int a[5] = { 3,4,5,6,7 };for (int i = 0; i < 5; i++) {for (int j = 0; j < 5 - i - 1; j++) {if (a[j] < a[j + 1])  SWAP(a[j], a[j + 1]);}}for (int i = 0; i < 5; i++) {printf("%d ", a[i]);}printf("\n");
}

运行结果:

2.宏定义参数替换的注意事项

  • 若宏定义中字符串出现运算符,需要在合适的位置加上括号,如果不加括号可能会出现错误。

#define S 3+4

a=S*c;//宏定义替换后的语句是a=3+4*c,与期望不符合。

修改为#define S (3+4)

则原语句替换为a=(3+4)*c

  • 宏定义的末尾不用加分号,如果加了分号,将会被视为被替换的字符串的一部分。宏定义只是简单的字符串替换,并不进行语法检查,因此宏替换的错误要等到系统编译时才能被发现。
  • 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在替换时由预处理程序嵌套替换。但宏定义不支持递归

#define PI 3.14159

#define P PI*x

double c=2*P;宏替换后的语句为c=2*3.14159*x;

宏定义不支持递归

所以#define MAX MAX+5是错误定义方法


三、带参数的宏定义和带参函数的区别

基本操作 带参数的宏定义 带参数的函数
处理时间 预处理期间 程序运行时
参数类型 需要定义的类型
参数传递 不分配空间,无值传递的问题(只是字符串替换) 分配内存,将实参传入形参
运行速度 相对较慢,因为函数的调用会涉及到参数的传递,压栈和出栈等操作

【C语言】宏定义(不带参数的宏定义和带参数的宏定义)相关推荐

  1. C语言第六课:函数(上)——分类、参数与调用

    目录 前言: 一.什么是函数? 二.C语言中函数的分类: 1.库函数: 为什么会出现库函数? 我们该怎么来学习函数? 库函数学习示例: 库函数学习注意: 2.自定义函数: 三.参数: 1.形式参数(形 ...

  2. Nautre综述:鸟枪法宏基因组-从取样到数据分析(2)2万字带你系统入门宏基因组实验和分析...

    宏基因组拼接 Metagenome assembly 已经公开了许多用于从序列读长库中重建微生物群落组成的方法.选择"最佳"是一项艰巨的任务,主要取决于研究的目的. 宏基因组从头/ ...

  3. 在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法

    在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法 1 致谢和参考文章 1.1 致谢 1.2 参考文章 2 环境介绍 3 整体思路 4 ...

  4. 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 )

    文章目录 前言 一.Groovy 中函数实参自动类型推断 二.函数动态参数注意事项 三.完整代码示例 前言 Groovy 是动态语言 , Java 是静态语言 ; 本篇博客讨论 Groovy 中 , ...

  5. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(四)

    ML之XGBoost:XGBoost参数调优的优秀外文翻译-<XGBoost中的参数调优完整指南(带python中的代码)>(四) 目录 Step 3: Tune gamma步骤3:伽马微 ...

  6. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(三)

    ML之XGBoost:XGBoost参数调优的优秀外文翻译-<XGBoost中的参数调优完整指南(带python中的代码)>(三) 目录 3. 参数微调案例/Parameter Tunin ...

  7. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(二)

    ML之XGBoost:XGBoost参数调优的优秀外文翻译-<XGBoost中的参数调优完整指南(带python中的代码)>(二) 目录 2. xgboost参数/XGBoost Para ...

  8. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(一)

    ML之XGBoost:XGBoost参数调优的优秀外文翻译-<XGBoost中的参数调优完整指南(带python中的代码)>(一) 目录 概述/Overview 介绍/Introducti ...

  9. C语言程序设计 | 程序环境和预处理:翻译环境和执行环境、宏、条件编译

    程序环境和预处理: 翻译环境和执行环境 宏 条件编译 翻译环境和执行环境 在ANSI C的任何一种实现中,存在两种不同的环境. 第一种是翻译环境,在这个环境中源代码被转换成可执行的机器指令.第二种是执 ...

  10. c 语言多参数函数,C/C++实现多参数函数编程

    在C/C++中,我们经常会需要实现类似printf这样的函数,即函数的参数个数是不定的,这个时候就需要用到我们这篇文章讲到的方法啦. 首先,我们要知道这种函数,如何来定义.比如我想实现一个函数能够支持 ...

最新文章

  1. 支付宝 php 返回false,支付宝php sdk验签rsaCheckV1不正确isSign一直返回false
  2. Centos下安装apahce的configure: error: APR not found. Please read the documentation解决办法
  3. linux haproxy 脚本,haproxy部署脚本
  4. free和top显示可用内存不一致
  5. swift5 实现录音App
  6. Unity3d暴风魔镜发布ios问题记录
  7. 怎样开图纸便宜_干货技能 | 十大技巧,吃透建筑施工图纸!
  8. select case语句_图解Go select语句原理
  9. mysql脚本之家_详细讲述MySQL中的子查询操作 (来自脚本之家)
  10. 关于修改域用户密码的WebPart的问题的问题.
  11. xp系统打开计算机配置文件,XP系统启动Windows零配置(WZC)服务教程(图文)
  12. 程序员纷纷“跑路”一线城市,背后的原因是?丨黑马观察
  13. Testin云测:搜狐新闻客户端5.0能否承载张朝阳“个性化阅读”梦想
  14. Chrome浏览器检查工具栏缩小
  15. 6种自动化测试框架(总有一款适合你)
  16. SEO优化与SEM(竞价)区别在哪?
  17. linux和pe修复win10启动项,pe下如何重建win10引导?pe下win10引导修复图文教程
  18. 硬核干货合集!500+篇Java干货技术文章整理|资源|书单|工具|面试指南|强烈建议打开!
  19. 【添坑】高博ORB_SLAM
  20. 【转】《DOTA系列》蛰伏恐惧之路——复仇之魂攻略

热门文章

  1. 如何使用Tika提取文件内容
  2. 中国潮汐能行业深度分析与投资前景战略研究报告2022-2028年版
  3. 有没有什么软件可以识别表格?快来试试这几个软件
  4. hive如何查找函数并查看函数使用方法
  5. apply函数的使用
  6. ubuntu下搭建僵尸毁灭工程专用服务器
  7. 通关 MySQL获奖名单已公布
  8. Pock 0.8.1 中文版 (在TouchBar中显示Dock栏图标)
  9. oracle 数据文件 属组,kfed找出来asm 磁盘组中数据文件别名对应的文件号—amdu恢复...
  10. javascript删除对象上的属性