一. c /c++语言中使用宏的主要目的主要有 3 个:

1. 提高代码的可读性;

把用到的常量定义成有意义的名字;

2. 无需函数调用,运行效率高;

对于一些简单的操作,无需调用函数,虽然编程是强调模块化,但是函数调用时,需要保护现场和恢复现场。这些都需要耗时。对于复杂的操作来讲,这些耗时可以不计,但是对于简单的操作,则效率低下。利用宏来代替简单的操作,则可以提高程序的运行效率。

3. 可维护行好;

对于用得比较多的常量或者简单操作,一旦需要修改,则只需要修改宏定义处,不需要逐条修改。

二. 宏定义命令 : #define

1 . #define命令主要是将一个标识符替换为一个字符串,该标识符称为宏名,被替换的字符串被称为替换文本。

2. 用法:

主要有两种格式,一个是简单的宏定义,另一个是带参数的宏定义;

简单的宏定义: #define

例: #define pi 3.1415

带参数的宏定义:#define ()

例: #define A(x) x

三. 宏替换

当宏定义好后,在程序中使用宏名就称为宏替换。当程序进行编译时实际上经过了预处理,编译(生成中间代码,即从源程序翻译为中间语言,即汇编),汇编(将汇编语言翻译成机器代码,即二进制代码),链接(将目标文件生成 .exe文件)。宏替换就发生在预处理(也叫预编译)阶段,也就是说在编译之前(生成二进制文件之前)就已经完成了文本的替换工作。

关于预处理主要完成的工作是:

1.文件包含,将#include包含的文件找到,并在#include处进行展开;

2.条件编译,根据#if #ifdef 等编译命令及其后的条件,将源程序的一部分包含进来或排除在外,通常把排除在外的语句换成空行。

3.宏展开,将程序中所用到的宏展开成宏定义的替换文本。经过宏展开之后的程序与之前的源程序的只是简单的文本替换,并无计算功能。这是理解宏的要点。

四. 使用宏要注意的问题

1.使用简单宏出现的问题

#include

#define n 2+2

int main()

{

int a = 0;

a = n * n;

return 0;

}

1

2

3

4

5

6

7

8

2.使用带参数的宏出现的问题

#include

#define product(a) a*a

int main()

{

int i = 4;

int j = product(i++);

printf("i = %d\n",i);

printf("j = %d\n",j);

j = product(++i);

printf("i = %d\n",i);

printf("j = %d\n",j);

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

在vs带的编译器下,程序输出结果 i = 6 j =16 i = 8 j = 64

四. 结语

本文主要讲了宏定义的用法以及要使用时要注意的东西,同时注意到宏替换在预处理阶段完成,只是进行文本替换。

五. 常用的宏定义

1 防止一个头文件被重复包含

#ifndef BODYDEF_H

#define BODYDEF_H

//头文件内容

#endif

1

2

3

4

2 得到指定地址上的一个字节或字

#define MEM_B( x ) ( *( (byte *) (x) ) )

#define MEM_W( x ) ( *( (word *) (x) ) )

1

2

3 得到一个field在结构体(struct)中的偏移量

#define OFFSETOF( type, field ) ( (size_t) &(( type *) 0)-> field )

1

4 得到一个结构体中field所占用的字节数

#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

1

5 得到一个变量的地址(word宽度)

#define B_PTR( var ) ( (byte *) (void *) &(var) )

#define W_PTR( var ) ( (word *) (void *) &(var) )

1

2

6 将一个字母转换为大写

#define UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )

1

7 判断字符是不是10进值的数字

#define DECCHK( c ) ((c) >= ''0'' && (c) <= ''9'')

1

8 判断字符是不是16进值的数字

#define HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''A'' && (c) <= ''F'') ||((c) >= ''a'' && (c) <= ''f'') )

1

9 防止溢出的一个方法

#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

1

10 返回数组元素的个数

#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

1

11 使用一些宏跟踪调试

ANSI标准说明了五个预定义的宏名。它们是

_LINE_ /*(两个下划线),对应%d*/

_FILE_ /*对应%s*/

_DATE_ /*对应%s*/

_TIME_ /*对应%s*/

1

2

3

4

python 宏替换_宏定义与宏替换相关推荐

  1. 两个excel文档查找相同选项后替换_看似普通的查找和替换功能,用好了,能让你的工作效率翻一番...

    关注[新精英充电站]能力提升看得见! 在Word中,查找和替换功能是编辑文档时时常要用到的重要功能,它能帮助我们快速将文档或表格中查找到的内容或格式等替换为指定的内容或格式,特别是遇到大量需要修改的相 ...

  2. python展开 c函数中的宏预处理_最基本的宏函数 课后习题9.2 (C语言代码)

    解题思路 利用宏函数. 函数. 本题的难点肯定不在算法, 应该是宏函数! 带参宏定义的一般形式为:#define 宏名(形参表) 字符串; 在字符串中含有各个形参. 带参宏调用的一般形式为: #def ...

  3. postgresql 吕宏庆_南阳义工吕宏庆荣登“好人365”封面人物

    2018年12月28日,我市"公益达人"吕宏庆荣登中国文明网第1574期<好人365>栏目封面人物,成为南阳市第4个入选该栏目封面人物的中国好人. <好人365& ...

  4. python汉字同义词替换_用WordNet和NLTK-python替换语料库中的同义词

    尝试编写简单的python脚本,该脚本将使用NLTK查找和替换txt文件中的同义词. 以下代码给出错误:Traceback (most recent call last): File "C: ...

  5. python正确方法_下列定义函数的方法,在Python中正确的是()。

    [多选题]异方差的后果包括 [单选题]Good communication is very important in marriage because a nice wedding is a(n) _ ...

  6. python未定义_未定义Python函数

    当我运行服务器(FLASK app)时,遇到一个函数未定义的错误: 名称错误:未定义名称"format_date" 这是我目前为止的所有代码:from flask import F ...

  7. scala字符串替换_如何在Scala中替换字符串中的正则表达式模式?

    scala字符串替换 Scala | 替换字符串中的正则表达式模式 (Scala | Replacing a regular expression pattern in a string) Repla ...

  8. c语言宏定义在预处理阶段,预处理和宏定义

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 宏定义 基本概念预处理部分: #include #define 放在函数之外,一般都放在源文档的前面 预处理由预处理进程 ...

  9. python宏替换_#和##在宏替换中的作用

    #include #define f(a,b) a##b #define g(a)  #a #define h(a) g(a) int main() { printf("%s/n" ...

最新文章

  1. python判断输入类型怎么做_如何检查输入类型?
  2. 关注CIO 3.0:企业CIO的最佳时代到来
  3. windows azure之创建虚拟机
  4. ML之NB:基于NB朴素贝叶斯算法训练20类新闻文本数据集进行多分类预测
  5. c语言格式字符If,C语言所有语句格式 C语言中的的if语句共有多少种格式?
  6. 游戏中DDA算法和Bresenham算法的应用
  7. w7提示无法关闭计算机,win7关不了机怎么回事?老司机教你怎么解决电脑关不了机...
  8. mysql数据库sql注入原理_sql注入原理详解(一)
  9. 【12-05】面试题
  10. linux下无mysql命令_linux下mysql命令
  11. ExtFrame的特点与缺点
  12. ASAv的qcow2镜像文件添加ASDM
  13. 商品规格表设计_计算机毕业设计分享jsp企业销售管理系统
  14. Tree Walk(二叉树的遍历)
  15. 植树节种树-第12届蓝桥杯Scratch选拔赛真题精选
  16. 赛前采访里皮表示:希望队员用真心踢球。
  17. 在cmd中进入mysql的步骤
  18. 1-6月中国ADAS供应商占比9% 又一家零部件巨头全面布局智驾新赛道
  19. 矩阵开根号_CVPR2018论文阅读-Faster MPN-COV:迭代计算矩阵平方根以快速训练全局协方差池...
  20. 快速简洁的Vue+Electron项目搭建教程

热门文章

  1. C# ADO.NET数据库操作
  2. 手机的功能能取代计算机的功能吗,手机平板电脑现在功能已非常强大!现在真的能取代台式电脑吗?...
  3. CSS3设计网页阴影特效艺术字
  4. 海王星给你好看!FineUI v4.0公测版发布暨《你找BUG我送书》活动开始(活动已结束!)...
  5. 在navicat运行SQL文件无法导入数据库数据的一个解决办法
  6. 基于tp框架的自定义常用函数,包括图片操作、阿里云OSS、文件下载、短信验证码等...
  7. 使用AVCaptureSession扫描二维码
  8. IntelliJ IDEA Community Edition 2021.2配置SVN过程详解
  9. YOLOV:图像对象检测器在视频对象检测方面表现也很不错
  10. Python字符串格式化--format()方法