Cpp知识点系列-宏定义

Cpp知识点系列-宏定义前言一句话,宏定义就是全局替换和声明的一种方式!我原本以为没必要详细了解,后来发现做错了题,纠结之后还是整理一下好了。宏定义掌握”宏&

欢迎大家来到IT世界,在知识的湖畔探索吧!

前言

一句话,宏定义就是全局替换和声明的一种方式!

我原本以为没必要详细了解,后来发现做错了题,纠结之后还是整理一下好了。

Cpp知识点系列-宏定义

宏定义

掌握”宏”概念的关键是“”。一切以换为前提、做任何事情之前先要换!

不含参

#define PI 3. 

欢迎大家来到IT世界,在知识的湖畔探索吧!

把程序中出现的PI全部换成3.

欢迎大家来到IT世界,在知识的湖畔探索吧!#define endl '\n' 

把程序中出现的endl全部换成字符‘\n’

含参

例子1

#include<iostream> #define endl '\n' #define SR(x, y) x+y using namespace std; void sum1() {     int a = 5, b = 4;     a += 2 * SR1(a, b);     cout << "sum1=" << a << endl;//结果是19 } 

第一步,先换:语句替换后成为a+=2*a+b

第二步,替换变量,语句替换后成为5+=2*5+4

第三步,计算式子,先是右侧公式计算结果为14,此时为5+=14;最后赋值到变量上,结果是19

例子2

欢迎大家来到IT世界,在知识的湖畔探索吧!#include<iostream> #define endl '\n' #define SR(x, y) ((x)+(y)) using namespace std; void sum2() {     int a = 5, b = 4;     a += 2 * SR2(a, b);     cout << "sum2=" << a << endl;//结果是23 } 

第一步,先换:语句替换后成为a+=2*((a)+(b))

第二步,替换变量,语句替换后成为5+=2*(5+4)

第三步,计算式子,先是右侧公式计算结果为18,此时为5+=18;最后赋值到变量上,结果是23

例子3

#define fun1(a) a void f1() {     cout << "f1=" << fun1(12 + 3)<< endl;//结果是数字15 } #define fun2(a) "a" void f2() {     cout << "f2=" << fun2(12 + 3)<< endl;//结果是字符串a } 

请看清楚,定义的后面究竟是参数本身还是带着双引号的字符串!

含参循环

#include <iostream> using namespace std; // #define doit(m, n) for(int i=0;i<(n);++i){m+=i;} #define doit(m,n) for(int i=0;i<(n);++i)\ {\ m+=i;\ } int main() {     int a = 5, b = 4;     doit(a, b);     cout << a;// 结果为11     return 0; } 

宏定义也是可以分行的!!!

宏定义也是可以运行循环的!!!

宏定义也是能让人栽跟头的!!!

宏定义语法特点

含#和##

  • 使用#把宏参数变为一个字符串
  • ##把两个宏参数贴合在一起
#include<iostream> using namespace std; #define endl '\n' #define STR(s)     #s #define CONS(a, b)  int(a##e##b) int main() {     cout << STR(vck)<< endl;       // 输出字符串"vck"     cout << CONS(2, 3);  // 2e3 输出:2000     return 0; } #undef CONS #undef STR 

其实照我现在的理解,有这种复杂需求的话还是写成函数更合适一些。

单纯为了炫技的话,当我没说……

更多详细应用还是参考原文博客吧,传送门在文末。

特点

  1. 宏定义末尾不加分号
  2. 宏定义写在函数的花括号外边,作用域为其后的程序,可以用#undef命令终止作用域
  3. 宏定义可以嵌套
  4. 字符串“”中永远不包含宏
  5. 宏定义不分配内存,想要分配内存去使用变量吧。
  6. 预处理不做语法检查。因为预处理是在编译之前的处理,而编译工作的任务之一就是语法检查
  7. 宏定义不做计算,只作替换
  8. 宏的哑实结合不存在类型,也没有类型转换。

优点

使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。

例如:数组大小常用宏定义。

与函数的区别

  1. 函数调用是在编译后程序运行时进行,并且分配内存。
  2. 宏替换在编译前进行,不分配内存
  3. 函数一般只有一个返回值,特殊情况下用pair也是一个对象,对象内两个值
  4. 宏则可以设法得到多个值
  5. 宏展开会使源程序变长,函数调用不会
  6. 函数调用占运行时间(分配内存、保留现场、值传递、返回值)
  7. 宏展开不占运行时间,只占编译时间

感谢

源文件:

gitee:https://gitee.com/JunKuangKuang/KeenCPPTest-all/tree/main/basic/define

github.com:https://github.com/JunKuangKuang/KeenCPPTest-all/blob/main/basic/define

感谢现在的好奇,为了能成为更好的自己。

王珂的个人笔记

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/69513.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信