宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。

宏定义和操作符的区别:宏定义是替换,不做计算,也不做表达式求解。宏定义又称为宏代换、宏替换,简称“宏”。在 C 语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。

宏定义的格式:#DEFINE 标识符 字符串

掌握"宏"概念的关键是“换”,一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”,即在对相关命令或语句的含义和功能作具体分析之前就要换。

定义宏需要注意以下几点:

(1)宏名一般用大写;

(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义;

(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查;

(4)宏定义末尾不加分号;

(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头;

(6)可以用#undef命令终止宏定义的作用域;

(7)宏定义允许嵌套;

(8)字符串( " " )中永远不包含宏;

(9)宏定义不分配内存,变量定义分配内存;

(10)宏定义不存在类型问题,它的参数也是无类型的。

在C语言/类C语言环境中,宏的作用有如下几种:

1.取代Magic Number

这个作用在嵌入式开发时太重要了。一个SoC 50多页的datasheet,上百个寄存器的位操作,如果没有很好的语义宏定义,调程序查手册绝对是崩溃的节奏!

2.防止重复定义

#ifndef XXXX

#define XXXX

#endif

3.快速控制代码编译

#define SIMULATION_DEBUG 1

#if SIMULATION_DEBUG

use simulated data

#else

real data

#endif

4.编译系统控制链

在某些系统下,可以把宏定义传递给编译器,从而通过编译脚本(makefile)来控制编译选项,例如,配合上面代码,就可以在Makefile里定义:

CDEFINES=$(CDEFINES) /SIMULATION_DEBUG

说到编译,自然还要提一下 ANSI C中预定义的几个非常有用的编译宏:

• _ L I N E _

• _ F I L E _

• _ D A T E _

• _ T I M E _

• _ S T D C _

例如

#define DEBUGMSG(msg,date) printf(msg);

printf(“%d%d%d”,date,_LINE_,_FILE_)

5.使用typedef

C语言下typedef也是属于宏定义,我会告诉你C语言下struct+typedef+函数指针可以做到面向对象的继承,重载和多态吗?(有兴趣可以看一下MFC的源码实现,把传统的C风格的Windows API各种包装修饰和装逼。)

typedef int (*PFFunc1)(int);

6.简化操作

得到一个字的高位和低位字节

#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))

#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))

宏定义是什么?为什么要进行宏定义?宏定义的格式相关推荐

  1. ACMNO.35 C语言-宏润年 给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y)

    题目描述: 给年份year,定义一个宏,以判别该年份是否闰年. 提示:宏名可以定义为LEAP_YEAR,形参为y, 既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串) 输 ...

  2. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  3. 给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串)

    题目描述 给年份year,定义一个宏,以判别该年份是否闰年.提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串) 输入 一 ...

  4. cmake取消宏定义_魔兽怀旧服,牧师实用宏

    相信很多人都知道WOW中的斜杠"/"和表情命令.宏可以将这些命令按照自己对条件的设置串联起来,比如:/Kneel是让你跪下来的动作而/say就是最基础的对话动作 我们现在用一个宏把 ...

  5. 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法

    C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...

  6. MetaPhlAn2-增强版宏基因组分类谱工具-一条命令获得宏基因组物种组成

    简介 MetaPhlAn2是分析微生物群落(细菌.古菌.真核生物和病毒)组成的工具,它在宏基因组研究中非常有用,只需一条完命令即可获得微生物的物种丰度信息(扩增子物种组成需要质控.拼接.拆样本.切除引 ...

  7. bootstranp选项卡怎么把每个选项卡里面的表单分开提交_EXCEL 宏应用基础知识,利用已实现的宏,制作自己的功能选项卡...

    前言 第一次使用excel vba编程,解决重复性的excel操作问题.虽然问题不难,但在设置宏的过程中,一点点解决了很多小问题,相信这些小问题也都可能是大家在应用该项功能中可能碰到的问题,对于在搜索 ...

  8. 宏程序自动生成软件_【软件】宏程序自动生成器V3.0下载

    宏程序自动生成器V3.0 宏程序自动生成器V3.0软件下载 (软件大小不足1M,无需安装,双击即可运行) 方法1:将此文章转发朋友圈,获取点赞20个以上,截图发送到 微信公众号:数控笔记 后台内,72 ...

  9. wps表格宏被禁用如何解禁_wps的excel中宏被禁用怎么办 - 卡饭网

    EXCEL中宏毒X97M.Laroux.DX1的解决办法 EXCEL中宏毒X97M.Laroux.DX1的解决办法 一般来说,EXCEL是不容易中毒的,要中毒的话,就会中宏代码的毒. 如果您的EXCE ...

  10. cdr宏教程_在CorelDRAW中了解和安装宏

    大多数人只知道在CorelDRAW软件中有宏这个功能,却不知道如何使用,其实它相当于一个批处理,可以通过使用宏自动化一系列重复任务来节约时间.通过宏可以指定一串操作,以便以后可以快速重复执行这些操作, ...

最新文章

  1. 科软2020计算机科学与技术,2020新高考 报考计算机类专业怎么选科
  2. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
  3. C/C++字符串使用整理
  4. 【图解】java8性能对比_Java 11 究竟比 8 快了多少?
  5. UITableView 界面小实例
  6. 文件I/O实践(2) --文件stat
  7. 2021赣一中高考成绩查询,赣州中学2021年高一招生问答
  8. 【Flink】Flink常量UDF-TableFunction优化
  9. 人工智能这把双刃剑的利指的是什么?
  10. 神器webssh学习笔记
  11. web前端设计与开发作品:旅游酒店网站设计——中国风的温泉酒店预订网站全套html模板(13页) HTML+CSS+JavaScript
  12. java物流管理系统代码_基于jsp的物流管理系统-JavaEE实现物流管理系统 - java项目源码...
  13. python中怎么统计英文字符的个数_python 输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数用python代码输入一行字符...
  14. 顺利通过2020年下工信部的系统架构设计师考试,在此感悟一下
  15. 【转帖】mysql锁机制
  16. 判断用户是否已关注公众号
  17. BT06串口蓝牙模块的配置以及与电脑的配对
  18. 全网首发!老大众奥迪碟盒通信协议破解,可以模拟数码碟盒,外接AUX蓝牙U盘等音频设备
  19. L1-078 吉老师的回归
  20. 如何学习opencv源码

热门文章

  1. Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, of
  2. 输出方波c语言程序,产生锯齿波以及方波的C程序
  3. 职场职位缩写 PM,TM,PL,TL,SE,PG,CEO,CFO
  4. 宿命论:为什么iPad的最大敌人会是iPhone?
  5. 数学通道的应用(六)-补偿气缸压力
  6. win10计算器_你所不知道的 Windows 10 小诀窍:万能计算器、虚拟键盘、屏幕截图标注...
  7. RestTemplate总结
  8. 基于VB和单片机的智能家居监控系统设计
  9. Factory Track 同步获取 Infor CloudSuite Industrial 数据
  10. 电驴服务器更新的作用,怎样更新eMule(电驴)服务器列表,有什么好处?