前言:

编译一个程序涉及很多的步骤

第一个就是预处理阶段
预处理器就是在源码编译之前进行一些文本性质的操作
主要任务比如: 删除注释,插入被include 包含的头文件的内容,替换由define定义的符号,以及确认根据
条件编译进行编译

预定义的符号

这些都是被占用的预定义的

符号 样例值 含义
__ FILE __ XXX.CPP 进行编译的源文件的名字
__ LINE __ 30 文件当前的行号
__ DATE __ Jan 32 1997 文件被编译的日期
__ TIME __ 12:00:00 文件被编译的时间

还有一些预定义宏

#define 机制包括一个允许把参数替换到文本中 ,这种规定成为 宏

#deine name(parameter-list)  stuff

注意: 这个parameter-list 参数列表,是由逗号分隔的列表 它的左括号必须与name 紧挨,否则被认为是
stuff 的一部分

我们定义一个宏 实现开方#define SQUARE(x)    x*xSQUARE(5)这时预处理器就会把这个替换为  5*5

看下面的代码

坑(一)
int a = 5;SQUARE(a+1)等于 6*6 = 36 ??错误仔细看 被转换为(5+1 * 5+1)结果为:11 是不是有坑我们改为#define SQUARE(x)   (x)*(x)这样就ok了
坑(二)
定义一个宏#define DOUBLE(x)   (x)+(x)int a  = 10 * DOUBLE(5);会出现什么结果? 20吗?错误展开宏10 * (5) + (5)结果为: 55所以我们还要在表达式两边加个括号#define DOUBLE(X)   ((X) + (X))这样就ok 了

宏与函数的对比

宏非常频繁的用于执行简单的计算比如 比大小

#define MAX(a,b) ((a) > (b) ? (a) : (b))

为什么不用函数呢?

第一 函数的代码写起来要比宏的代码量要大
第二 用宏在执行小型的代码量时速度要比函数快
第三 如果不用模板写法 函数参数必须要指定参数类型,而 宏 double int float 都可以传入

这些优点都要建立在 宏定义非常短的前提下

带副作用的宏参数

当宏参数在宏定义中出现超过一次,这个参数就具有副作用,可能就会出现危险,导致不可预料的结果

来看下面的代码 (大坑)

#define MAX(a,b) ((a) > (b) ? (a) : (b))int x = 5;
int y = 8;int z = MAX(x++,y++);z 是多少?
13 ? 15 ?
x,y 是多少?6,9?这样写有坑啊 大坑
宏展开((x++) > (y++) ? (x++) : (y++))
((5++) > (8++) ? (5++) : (8++))这个问号表达式由前部分和后部分组成的
前半部分都执行 而 后半部分 只执行问号确的那个所以前面变为 6 > 9 ?
后面 执行 y++
那么 z = 9
y 是 10
x 是 6卧槽 这样的代码写出来 搞毛啊所以为了避免这样的问题出现,我们要把宏参数存储到临时变量中int x = 5;
int y = 8;x++;
y++;int z = MAX(x,y);这样就可以了

命名约定

value = max(a,b);
这是一个宏还是一个参数 ?这样看根本区分不出来
为了不查看定义部分 直观一点命名约定 宏 要大写字母

宏和函数的不同之处

属性 #define 宏 函数
代码长度 每次使用时,宏代码都会插入到程序中,所以宏的定义要非常剪短的才有优势 函数的代码只会出现在一个地方,每次使用时都会调用同一份代码
执行速度 更快 多于宏的 函数调用和返回时的额外的开销
操作符优先级 宏是根据周围表达式的优先级,一定要加括号否则会出现上文中的问题 中规中矩,结果比较好预测
参数类型 宏与类型无关,只要参数的操作是合法的就可以 除非使用模板,否则必须要指定参数的类型

ok 如果本文对您有帮助,请点个关注和赞支持一下小弟,谢谢了!

预定义 宏 #define 详解相关推荐

  1. linux系统预定义变量有哪些,Shell预定义变量用法详解

    预定义变量是在 Shell 一开始时就定义的变量,这一点和默认环境变量有些类似.不同的是,预定义变量不能重新定义,用户只能根据 Shell 的定义来使用这些变量. 严格来说,位置参数变量也是预定义变量 ...

  2. 转 C++宏定义详解

    来自:传送门 C++宏定义详解 一.#define的基本用法 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往 ...

  3. C++中的宏定义详解

    转载自:C++中的宏定义 和 C++宏定义详解 目录 一.#define解析 1 #define命令剖析 1.1   #define的概念 1.2 宏替换发生的时机 1.3 ANSI标准说明了五个预定 ...

  4. C语言怎么判断字符YN,c语言中的宏_详解(转)

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...

  5. ANSI C and Microsoft C++中常用的预定义宏以及 宏定义中 # 和 ## 的区别

    ANSI C and Microsoft C++中常用的预定义宏以及 宏定义中 # 和 ## 的区别 第一部分,常见的预定义宏 第二部分,# 和 ## 再宏定义中的使用说明 第三部分,类似 #prag ...

  6. 2019-11-07 检查gcc交叉编译器预定义宏(ARM32/ARM64/X86-64)以及对浮点数的支持情况

    预备知识1 armel.armhf和arm64区别选择 https://www.veryarm.com/872.html 预备知识2 https://www.veryarm.com/872.html ...

  7. [C/C++] 显示各种C/C++编译器的预定义宏(C11标准、C++11标准、VC、BCB、Intel、GCC)

    转载自来源: [C/C++] 显示各种C/C++编译器的预定义宏(C11标准.C++11标准.VC.BCB.Intel.GCC) http://dev.gameres.com/Program/Othe ...

  8. fanuc换刀宏程序详解_FANUC宏程序详解

    <FANUC宏程序详解>由会员分享,可在线阅读,更多相关<FANUC宏程序详解(48页珍藏版)>请在人人文库网上搜索. 1.用户宏程序,用 户 宏 程 序,用户宏程序,一.变量 ...

  9. C语言预定义宏 __func__、__FUNCTION__、__LINE__、__FILE__、__DATE__、__TIME__

    文章目录 20211231 打印示例 今天看RXW源码的时候,看到了在函数里使用 __func__ 参数的样例,遂查一下这两玩意的使用方法 这玩意叫做预定义宏 标准C语言预处理要求定义某些对象宏,每个 ...

  10. Java中的宏变量,宏替换详解。

    转载自 Java中的宏变量,宏替换详解. 群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 输出true false 来看下面这段程序,和群友分享的大致一样. public static vo ...

最新文章

  1. 影响和改变世界的50件发明专利,猜下中国有几个?
  2. win32: 查询滚动条相关信息的注意事项
  3. Java Web学习计划
  4. 深度相机 物体三维重建_基于深度相机进行室内完整场景三维重建的方法及系统_2017100513665_说明书_专利查询_专利网_钻瓜专利网...
  5. 计算机网络专科升本科,目前专科升本科有哪几种途径?
  6. 安装Sqlserver2008的问题
  7. rsa前后端加密流程_不懂前后端分离?这篇就够了
  8. struts2文件下载
  9. TCP/IP 基础简介
  10. Python字符串translate()
  11. [ICLR18]联合句法和词汇学习的神经语言模型
  12. CITE 2018盛大开幕,精彩看点速来围观
  13. 离线语音合成使用——科大讯飞or云知音or百度语音
  14. 解决windows10下总是很快进入睡眠问题
  15. CSS解决图片过大撑破DIV的方法
  16. Json与List、Map、entity的互相转化
  17. 一个初中生到程序员的辛酸经历(转载)
  18. 解决 Nacos 服务注册使用 Docker 容器内网 ip 问题
  19. 华为面试题库c语言,华为校园招聘c语言面试题集.doc
  20. 【动网论坛7.1 sp1 修改】-关于增加本帖地址[复制本页地址 粘贴]的修改方法...

热门文章

  1. Photoshop设计精讲精练笔记(二)
  2. flume Consolidation
  3. SD卡无法识别的问题解决 ”mmc0: error -110 whilst initialising SD card”
  4. TCGA数据库的利用(三)——基因注释!
  5. 哈夫曼树以及哈夫曼编码
  6. SAP开发入门-ABAP
  7. DW_axi_dmac控制器(概述)
  8. maven本地资源库设置和参数说明
  9. 朱啸虎建议创业者忘记区块链,遭应书岭回讽:你老了
  10. 《京东话费充值系统架构演进实践》阅读笔记