作者:独舞风

链接:c语言宏定义(1)

1、为什么要有宏定义?

代码中某个特定数值需要参与运算,而且该数值作用于多个地方,当需要对该数值进行修改时,希望只改动一个地方就能实现该数值的全部更新;即便某个数值只用到一次,当修改时也会面临搜索阅读大量代码、数值含义不明晰的问题;某些“操作块”封装成函数时,调用函数开销(保存上下文环境、参数调用、堆栈分配等)太大影响效率,不封装则需要多次输入相同的“操作块”内容,并且修改麻烦容易出现不一致的问题,这时就需要把“操作块”定义成宏,该方案本质是“空间换时间”。

总之,宏的出现时为了:提供代码可读性、增加代码书写效率和提高系统运行效率。

2、宏的产生背景是什么?

宏的本质就是“无条件替换”,而且宏只对程序的文本起作用,它眼中的世界只有文本(字符),没有逻辑运算。记得学习C时,老师告我们:“每条语句后边都要加分号“;”,但是宏定义不能加“,问原因竟然是:”就是不能,记住就行!“。现在知道原因了:如果加了分号,分号就成为了宏定义的一部分,在进行”宏展开“时直接截断语句,当然会出问题。

确切的说, 程序源代码(*.c文件)是不能被计算机直接执行的,编译器需要对程序代码进行“一系列处理”,转换成计算机能读懂的二进制文件(*.bin)。这涉及到编译原理的知识了(如果有机会,我会就编译原理进行讲解),一系列处理包括:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。“宏展开”过程就发生在“预处理”阶段,编译器负责用实际数据替换掉宏名,所以经过了“预处理”,函数代码中就已经没有所谓宏的概念了。

下面我将做个试验,进行验证:

(1)在Fedora环境下,键入“vi test_macro.c”输入下面的代码并保存

(2)退出vi环境,键入“gcc -E test_macro.c”执行,效果如下

(3)试验结果分析:

"gcc -E test_macro.c" 命令就是告诉编译器只对代码进行预处理,不再进行后续工作直接输出。可以看到,我们定义的宏PI和R都已经不存在了,而且都被替换成了它们各自的常量值。main函数上面的那些函数声明,是stdio.h文件的展开,预处理阶段不只进行了宏展开,还对包含的头文件进行了展开,这里不再细说。

下一节,我们将结合试验数据,对宏使用过程中的一些注意事项进行分析。

转载于:https://www.cnblogs.com/flyingdirt/p/4214158.html

转载--c语言宏定义(1)相关推荐

  1. C/C++语言宏定义##连接符和符#的使用

    C/C++语言宏定义##连接符和符#的使用     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/53113187 (一) ...

  2. c语言中#39;xd#39;代表什么,关于C语言宏定义的技巧:#39;##39;和#39;###39;

    关于C语言宏定义的技巧:'#'和'##' '#'和'##' '#'和'##'是两个预处理运算符,只能在预处理的过程中使用.在带参数的宏定义中, '#'运算符后面应该跟一个参数,预处理器会把这个参数转换 ...

  3. c语言 宏定义 去除宏定义_如何检查是否在C中定义了宏?

    c语言 宏定义 去除宏定义 To check whether a Macro is defined or not in C language – we use #ifdef preprocessor ...

  4. c语言宏定义技巧和用法,关于C语言宏定义的技巧:'#'和'##'

    关于C语言宏定义的技巧:'#'和'##' '#'和'##' '#'和'##'是两个预处理运算符,只能在预处理的过程中使用.在带参数的宏定义中, '#'运算符后面应该跟一个参数,预处理器会把这个参数转换 ...

  5. c语言 宏do while,关于C语言宏定义 使用do{ xxxx }while()

    暂时感觉像是由于":"的原因,关于使用习惯方面的问题!! 下面是copy的: 这样的宏见过么: Cpp代码 #define FOO(x) do {\ some_code_line_ ...

  6. c语言宏定义(c语言宏定义是什么意思)

    C语言宏定义名可以有括号和分号吗? 宏定义的名称,是C语言标识符的一种,和函数名,变量名的命名规则是一样的,只允许使用数字,字母,下划线,且不能以数字开头. 所以宏名是不可以有括号和分号的. 另外,在 ...

  7. C语言宏定义-跟踪调试宏

    C语言宏定义-跟踪调试宏 文章目录 C语言宏定义-跟踪调试宏 1. 简介 2. 相关宏 3. 例子 1. 简介 标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预 ...

  8. STM32的C语言重点知识(1.C语言数据类型+2.C语言宏定义+3.C语言typedef+4.C语言结构体+5.C语言枚举)

    1.C语言数据类型: 注:目的是看到stdint,如看到int8_t;uint16_t能够瞬间知道表示的是char,8字节:unsigned short,16字节. ST关键字意思是在老版本的引脚说明 ...

  9. 宏定义 指针 c语言,C语言宏定义讲解(C和指针 笔记)

    关于C语言宏定义#define 最常用的莫过于通过宏定义定义常数了,例如 #define MAX 1000      通过宏定义程序中需要的常量,方便维护被多次引用的变量,并且宏替换在预处理阶段完成, ...

最新文章

  1. 网络协议分层_接口测试之网络分层和数据
  2. [概统]本科二年级 概率论与数理统计 第七讲 期望、方差与相关性
  3. android 基类fragment,Android DialogFragment 基类的定制
  4. 基于matlab的pcm系统仿真_深入理解基于RISC-V ISS Spike的仿真系统:探索Spike,pk和fesrv...
  5. 阿里云 Aliplayer高级功能介绍(四):直播时移
  6. 零基础 | 入行软件测试,你想知道的都在这里了
  7. python3 歌词文件krc转lrc
  8. java企业公文流转系统ssm框架
  9. 高斯消元求解四种方程组
  10. Linux的du命令
  11. Apple, Steve Jobs, iCon
  12. Mysql全站最全笔记,从入门到资深!
  13. Ubuntu18.04 更改GRUB引导菜单背景图片和默认启动项
  14. 塔科夫为什么远程服务器返回错误,逃离塔科夫登陆错误解决教程
  15. 下载vimeo视频_使用Vimeo的API和Slim构建基本的视频搜索应用
  16. 未来5年光通信系统十大技术趋势发布
  17. 分享两个实用APP给你
  18. MAL-Gold Nanoparticle/Au nanoparticles纳米金颗粒/金纳米粒子|50nm浓度:0.5mg/ml
  19. (非全景图)神奇的全景视频360制作教程
  20. Linux基本命令的使用(一)

热门文章

  1. 判断多边形边界曲线顺/逆时针
  2. 数字n,按字典排序,找出第k小的数字
  3. 利用tensorflow建立简单的神经网络所需要的几条简单语句
  4. 用户不见了_03 | 为什么你设计的信息用户总是看不见
  5. java对cpu线程的要求_java-CPU份额对线程有什么影响
  6. access violation at address in module Read of address
  7. 【题解】p1064 金明的预算方案
  8. aop-xml-环绕增强
  9. 03-命令图片.doc
  10. [Swift]LeetCode793. 阶乘函数后K个零 | Preimage Size of Factorial Zeroes Function