毕竟是小白,从小白视角看可能不会太深,但应该都能看懂。
这篇博客就是也是写给新手的,希望大家都能学懂学好,嘿嘿,写的不好还望大佬勿喷。

可以使用#define 伪指令来定义一个宏。 宏分为不带参数的宏和带参数的宏。
宏定义以#define 关键字后面出现的第一个连续字符序列作为宏名,剩下的部分作为宏体。
宏定义具有文件作用域,不论宏定义出现在文件中的哪个地方,例如函数体内、类型定义内部、名字空间内部等,在它后面的任何地方都可以引用宏

宏的几个特点和注意事项如下。

  1. 宏定义不是C++/C语句,因此不需要使用语句结束符 “;”, 否则它也被看做宏体的一部分。例如:
    例一:正确写法:
#include <stdio.h>
#define PRICE 30
void main(){int num , total;num = 10;total = PRICE*num;printf("%d\n",total);}

例二:错误写法

#include <stdio.h>
#define PRICE 30;   //注意这边的分号
void main(){int num , total;num = 10;total = PRICE*num; /printf("%d\n",total);}

例三:正确:这后面的分号就被看作宏体的一部分了

#include <stdio.h>
#define PRICE 30;   //注意这边的分号
void main(){int num , total;num = 10;total = num*PRICE; //注意这边的分号  这句也可以这样写,结果一样 total = num*PRICE; ;printf("%d\n",total);}

使用方法为:

OUTPUT(I like swimming very much.);

替换结果就是:

cout << “I like swimming very much.”《endl;

  1. 任何宏在编译预处理阶段都只是进行简单的文本特换。不做类型检查和话法检在,这个工作留给编译器进行。参数替换发生在宏扩展之前。
  2. )宏定义可以嵌套。例如:
#define PI3.14
#definePI 2 (2* PI)
  1. 宏不可以调试,因为宏不会进入符号表(符号表是编泽器创建的。在编译时宏已经消失了),即使宏替换后出现了语法错误,编译器也会将错误定位到源程序中而不是定位到具体的某个宏定义中。
  2. 程序里使用双引号括起来的字符串中即使出现了与宏同名的子串,预处理遵过程也不进行替换。
  3. 定义带参数的宏时,宏名和左括号之间不能出现空格,否则使用时会出现问题,但是编译器不会检查出这种错误。例如,宏TEXT如果定义为下面这样是报错的
#include <stdio.h>
#define PRICE 30;
#define TEXT (str)   //注意这边的分号
void main(){printf(TEXT(Hello));}
  1. 带参数的宏体和各个形参应该分别用括号括起来,以免造成意想不到的错误。例如:
#define SQUARE(x) ((x)* (x))a= SQUARE(3+ 5):
*************************
a=8*8=64

如果写成

#define SQUARE(x)  x*x
a= SQUARE(3+ 5):
**************************
a=3+5*3+5=23
  1. 不要在引用宏定义的参数列表中使用增量和减量运算行,否则可能导致变量多次求值,且结果可能与预期不符,因为复合表达式中子表达式的求值顺序。因具体编译器的不同而不同。
#define SQUARE(x) ((x)* (x))
int n=5;int x= SQUARE(n++);其结果可能是30,也可能是25。
  1. 带参数的宏定义不是函数,因此没有函数调用的开销,但是其每次扩展都会生成重复的代码,结果使可执行代码的体积增大。
  2. 当我们不再使用某个宏时,可以使用#undef来取消其定义。否则简单地删除宏定义会带带来许多编译错误,例如:
 #undef TEXT

建议

  1. 虽然宏定义很灵活,并且通过彼此结合可以产生许多变形用法是C++/C程序员不要定义很复杂的宏,宏定义应该简单而清晰
  2. 宏名采用大写字符组成的单词或其缩写序列,并在各单词之间使用 _ 下划线分隔
  3. 如果需要公布某个宏,那么该宏定义应当放置在头文件中,否则放置在实现文件(.cpp) 的顶部:
  4. 不要使用宏来定义新类型名,应该使用typedef, 否则容易造成错误;
  5. 给宏添加注释时请使用块注释(/* */), 而不要使用行注释。因为有些编译器可能会把宏后面的行注释理解为宏体的一部分;
  6. 尽量使用const取代宏来定义符号常量
  7. 对于较长的使用频率较高的重复代码片段,建议使用函数或模板而不要使用带参数的宏定义:而对于较短的重复代码片段,可以使用带参数的宏定义,这不仅是出于类型安全的考虑,而且也是优化与折衷的体现;
  8. 尽量避免在局部范围内(如函数内、类型定义内等)定义宏,除非它只在该局部范围内使用,否则会损害程序的清晰性。

小白来学C语言之宏定义(#define)相关推荐

  1. C语言 | 预处理 | 宏定义 | #define | 定义函数

    文章目录 预处理 预处理运算符 宏定义 无参宏定义 带参宏定义 宏定义-定义函数 此文主要介绍宏定义,并在介绍宏定义时举例介绍预处理命令 预处理 参考:C 预处理器 | 菜鸟教程 重要的预处理器指令如 ...

  2. C语言常用宏定义(#define)使用方法

    ·  正  ·  文  ·  来  ·  啦  · 前言 ------在上篇文章里面,我们分析了预处理的一个完整过程,这能够让我们理解一个写好的程序,在生成一个可执行文件,到底发生了什么,对我们在大型 ...

  3. 宏定义Define的一些用法

    ---转载百度文库 一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处 ...

  4. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  5. c语言用宏定义常量_使用宏定义常量以在C的数组声明中使用

    c语言用宏定义常量 As we know that, while declaring an array we need to pass maximum number of elements, for ...

  6. C/C++编程笔记:浅析 C 语言中宏定义的使用,知识点全解

    宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名.给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很 ...

  7. 【C语言】----宏定义,预处理宏

    什么是宏? 宏是学习任何语言所不可缺少的,优秀的宏定义可以使得代码变得很简洁且高效,有效地提高编程效率. 宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串,解释器或编译器在遇到宏时会 ...

  8. c语言中宏定义的字符替换#define M(x,y,z) x*y+z

    C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdl ...

  9. C语言-入门-宏定义(十七)

    预处理 编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是宏发挥作用的阶段.C预处理器在源代码编译之前对其进行一些文本性质的操作,主要任务包括删除注释.插入被#include进来的文件内容.定义 ...

最新文章

  1. IplImage 类型和 CvMat 类型转换为 Mat 类型
  2. MobileNet-SSD
  3. 岗位推荐 | 阿里巴巴达摩院招聘自然语言处理、机器翻译算法专家
  4. 如何设置XMind思维导图线条
  5. 【渝粤教育】 广东开放大学 21秋期末考试物业经营管理实务10123k2
  6. RTX5 | 消息队列04 - (实战技巧)串口中断回调函数ISR同步线程
  7. qt 怎么设计个性化的滑块_滑块上走滑块模具结构设计,不一样的结构思维成就你的高薪职业...
  8. 变量的解构赋值(对象)
  9. 浅谈UWB室内定位(二)
  10. XAF How to: Implement Domain Components(如何实现领域构件)
  11. 好用的蓝牙管理工具推荐,帮您优雅管理蓝牙功能!
  12. 附加:tkmybatis简介;(Mybatis-Plus和tkmybatis对比)
  13. 永磁同步电机数学模型
  14. HTB-SolidState
  15. Java(十三)集合类(2)
  16. VMware虚拟机 之 VMX进程已提前退出
  17. nmap简单实用命令
  18. Windows10系统重装
  19. vue2、vue3中使用swiper
  20. 使用python画图

热门文章

  1. 将更新面板的显示内容清除的代码实现;_免费开源:墨涩必应壁纸网盘系统1.0(自动壁纸更新免维护)
  2. fastreport 横向分栏_FastReport开发指南
  3. swiftui 跳转_酷!苹果推出 SwiftUI,提高编程效率
  4. DAY06-Python入门学习-元组、字典、集合类型
  5. 【WCF】服务并发中的“可重入模式”
  6. 终止线程的三种方法(转)
  7. WebView起步1
  8. Android 加入一个动作按钮
  9. Memcache架构新思考
  10. 推荐40个优秀的免费CSS工具