> 文章列表 > 浅谈C语言中的宏定义

浅谈C语言中的宏定义

浅谈C语言中的宏定义

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、宏定义的基本介绍
  • 二、宏定义的形式
  • 三、宏定义使用中的小坑 && 小技巧
  • 四、带参数的宏定义
  • 五、常见的宏定义指令
  • 总结(非知识,时间紧可直接略过,珍惜时间即可)


提示:以下是本篇文章正文内容,下面案例可供参考

一、宏定义的基本介绍

1、计算机语言如C或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C的宏预处理器的工作只是简单的文本搜索和替换

2、#define PI 3.14 就是宏定义,N做为宏名,3.14就是宏的内容(宏所表示的字符串。在预处理阶段,对程序中所有出现的“宏名”,预处理器都会使用宏定义中的字符串区进行替换,这称为“宏替换”或“宏展开”。宏定义是由源程序中的宏定义命令#define完成的,宏替换是由预处理程序完成的。

二、宏定义的形式

#define   宏名  字符串
1、所有的预处理命令都以 # 开头(注意:宏定义末尾不需要加 分号,而使用typedef为现有类型创建别名末尾需要加 分号)。

2、宏名属于标识符的一种,命名规则和变量相同。

3、字符串可以是数字、表达式、if语句、函数等。这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。

三、宏定义使用中的小坑 && 小技巧

1、宏定义在程序中只起到替换作用,不会进行计算

2、如果在宏定义行末加上分号,则会将分号一起替换。

例如:这个程序,要是仔细看就可以发现var = PI语句后面缺少分号,应该是要报错的,但是它却正常编译且输出了3.14。原因就在于程序运行过程中遇到宏名,就会用字符串替换宏名,而字符串就是  3.14;
浅谈C语言中的宏定义

3、预处理程序对宏定义不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现

浅谈C语言中的宏定义这里我使用Linux系统下给大家演示。 由于这里涉及到一些Linux系统的知识。下面只介绍与本篇文章有关的知识,感兴趣的同学可以自行学习Linux系统的知识。

gcc -E “.c文件” -o “输出.i文件” 只进行预处理,不做其他处理
gcc -S “.i文件” -o “输出.s文件” 只是编译不汇编,生成汇编代码

4、宏定义的作用域是从 宏定义命令开始位置 到 源程序结束。要终止其作用域,我们可使用 #undef 命令进行终止。

5、宏定义是用宏名来表示一个字符串。字符串可以包含任何字符,它可以是常数、表达式、if语句、函数等

7、宏名其实也可以不使用大写,只是因为写的人多了,也就习惯上宏名使用大写字母表示这样可以更好的区分宏名与变量。

我这里举一个小写字母的栗子
浅谈C语言中的宏定义

8、宏定义与typedef使用的区别typedef 相当于给原有数据类型起了一个新名字,但是宏定义只是使
用宏定义中的字符串替换掉原先的宏名。

四、带参数的宏定义

1、带参宏定义的一般形式为 #define    宏名(形参表)    字符串

2、带参数宏定义中,宏名和形参列表之间不能有空格出现,但是形参之间可以出现空格 。

例如这个栗子:形参之间可以出现空格
浅谈C语言中的宏定义
如果宏名和形参之间出现空格,程序就会报错。
浅谈C语言中的宏定义

3、在带参宏定义中,不会为形式参数分配内存,我们不必指明数据类型是因为宏定义不会为形参分配内存。但
在宏调用中,实参包含了具体的数据,因此这里的实参必须要指明数据类型。

4、在宏定义中,字符串内的形参通常要用括号括起来以避免出错。

例如这个程序:
浅谈C语言中的宏定义

五、常见的宏定义指令

# 空指令,无任何效果#include 包含另外一个文件#define 定义宏#undef 取消已定义的宏#if 如果给定条件为真,则编译下面代码#ifdef 如果宏已经定义,则编译下面代码#ifndef 如果宏没有定义,则编译下面代码#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写#endif 结束一个#if……#else条件编译块#error 停止编译并显示错误信息#warning 显示警告信息但不停止编译,往往在以后必须注意的地方加入,可以随时提醒。

以我目前的知识量,我认为它在于单片机和C语言中还是比较重要的(个人想法,仅供参考)。


总结(非知识,时间紧可直接略过,珍惜时间即可)

如果你已经看到了这里,我希望你可以给我一个点赞(很感激)、收藏(十分感激)、关注(十分十分感谢)。大家的支持是我坚持下去的动力。如果你的流量很贵的话,我也很感激你能够看到这里,谢谢你。