• 宏定义 #define

    • 常用宏定义命令
    • 不带参宏定义
    • 带参的宏定义
    • 宏函数
    • #pragma
    • 使用示例

宏定义 #define

宏定义能够在代码中直接替换相关的内容,恰当地使用可以提高程序的执行效率,提高程序的清晰度和可读性,提供了一种复用方式(否则都得用函数编写),省去了分配和释放栈帧、传参、传返回值等一系列工作, 但是大量使用也会造成代码可读性下降。

常用宏定义命令

命令 解释
define 定义一个预处理宏
undef 取消宏的定义
include 包含文件命令
include_next 与#include相似, 但它有着特殊的用途
if 编译预处理中的条件命令, 相当于C语法中的if语句
ifdef 判断某个宏是否被定义, 若已定义, 执行随后的语句
ifndef 与#ifdef相反, 判断某个宏是否未被定义
elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
else 与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
endif if, #ifdef, #ifndef这些条件命令的结束标志.
defined 与#if, #elif配合使用, 判断某个宏是否被定义
line 标志该语句所在的行号
“#” 将宏参数替代为以参数值为内容的字符窜常量
“##” 将两个相邻的标记(token)连接为一个单独的标记
pragma 说明编译器信息
warning 显示编译警告信息
error 显示编译错误信息

   其中 ## 表示连接两个字符, # 表示将参数字符串化

不带参宏定义

例如: #define MAX 1000

   (1)宏名一般用大写(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。(4)宏定义末尾不加分号;(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。(6)可以用#undef命令终止宏定义的作用域(7)宏定义可以嵌套(8)字符串" "中永远不包含宏

带参的宏定义

例如:#define ADD(x,y) ((x)+(y))

1)实参如果是表达式容易出问题#define S(r) r*rarea=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;正确的宏定义是#define S(r) (r)*(r)(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存(5)宏的哑实结合不存在类型,也没有类型转换。(6)函数只有一个返回值,利用宏则可以设法得到多个值(7)宏展开使源程序变长,函数调用不会(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)(9)宏定义不分配内存,变量定义分配内存。宏替换发生的过程

宏函数

//此函数会一直打印 “hello”
#include<stdio.h>#define FOO(str)printf("%s",str);#define FUN1(i)do{printf("hello");}while (i)#define FUN2(i)for (;i;){printf("hello");}int main(void)
{FOO("hello");if (3){FUN2(2)}elseFUN1(0);getchar();return 0;}

#pragma

去除4127号警告 #pragma warning(disable:4127)

使用示例

#define forEachAs( listtype, list, iter ) \for ( listtype::iterator iter = (list)->begin(); iter != (list)->end(); ++iter )#define ADD(a,b) (a+b)

C++ 菜鸟之路 (一) 宏定义整理相关推荐

  1. iOS - 常用宏定义和PCH文件知识点整理

    (一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...

  2. 宏定义#define整理

    一.宏定义#define 优点:一方面可以节省程序的空间上的篇幅,另外,恰当地使用宏定义可提高程序的时间效率.代码可以写的通俗易懂.可以提高程序的清晰性.可读性,使于修改移植等. 缺点:宏定义的使用实 ...

  3. 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数

    文章目录 一.宏定义(#define)的作用 1.普通宏 2.带参宏 [注]:特殊用法 3.其他用法和注意点 二.实际问题(函数设计) 1.原题 2.题解参考 (1).面向过程的设计 (2).面向对象 ...

  4. 【转自猫大】宏定义的黑魔法 - 宏菜鸟起飞手册

    宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在 ...

  5. Unity功能——宏定义的使用

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能--宏定义的使用 文章目录 Unity功能--宏定义的使用 一.开发环境 二.问 ...

  6. python 非线性回归_机器学习入门之菜鸟之路——机器学习之非线性回归个人理解及python实现...

    本文主要向大家介绍了机器学习入门之菜鸟之路--机器学习之非线性回归个人理解及python实现,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 梯度下降:就是让数据顺着梯度最大的方向,也 ...

  7. C 图像处理 颜色相关宏定义

    很多年前整理的,像素处理的宏定义,包括r8g8b8到r5g6b5之间的相互转化,浮点数像素与整数值之间的相互转化,像素值的插值.取反等处理.具体没什么好说的,宏定义的代码还是很容易看的.这套东西对搞图 ...

  8. (转载) min()的宏定义中的(void) (_x == _y)的含义

    Original Address:http://www.crifan.com/2010/08/13/order_min__macro_definition_void_amp__x__amp__y_th ...

  9. JavaScript学习笔记:常量,枚举,宏定义

    NodeJS常量(fake:宏定义) 因为之前C/C++代码开发习惯了,会用到一些宏定义来替换一些表意不明的数字(就是含义不清的数字).而JS没有这种宏定义. 上网找到一个链接作为参考:https:/ ...

最新文章

  1. com.android.phone已停止 vivo,oppo,vivo应用程序终止通知不在android fcm中出...
  2. python获取一个月之前日期_Python 获取几天前的时间
  3. 将字符串String str= “abc god 中国 java“ 反转每个单词 结果: “cba dog 国中
  4. 给老板做PPT必备:文字加拼音
  5. 动易Ajax登陆调用
  6. 剑指offer面试题63. 股票的最大利润(动态规划)
  7. sosoapi的安装
  8. 运筹说 第36期 | 算法介绍之运输问题
  9. Registry Workshop —— 强大的注册表编辑工具
  10. 详解网关和路由器的区别
  11. 解决合并压缩包分卷无法解压 错误信息:文件格式未知或者压缩文件数据已经损坏
  12. 主图指标,原创极强黄点,将军柱和黄金柱都是3日的
  13. c语言bellman算法,深入理解Bellman-Ford(SPFA)算法
  14. 【SeedLab】ARP Cache Poisoning Attack Lab
  15. sql中1=1,1=0 ,1 大于 1,1 小于 1代表什么
  16. Java中如何打印数组
  17. ubuntu-sudo命令
  18. PC与Android通过USB连接进行Socket通信
  19. 黄一孟:骑着电驴找金矿
  20. linux ssh 登陆后欢迎界面 banner 设置操作

热门文章

  1. ElasticSearch 7.x 简体/繁体搜索
  2. prettierrc.json 配置
  3. ElasticSearch知识点汇总
  4. SpringBoot 整合EasyExcel详解(一)-高性能Excel方案
  5. 可逆数据隐藏python实现(Reversible Data Hiding)
  6. 怎么安装Python,超详细,零基础必看
  7. U盘无法读取,不显示盘符
  8. 一款开源免费跨浏览器的视频播放器--videojs使用介绍
  9. Python小白日志2(阿拉伯数字转中文汉字)
  10. 如何处理CAN通讯故障