宏定义:使用#define伪指令定义一个宏

宏体中包含命名空间信息导致vs大量报红,但编译和运行却正常

宏分为不带参数的宏和带参数的宏。
在带参数的宏中,关键字#define后面出现的第一个连续字符序列作为宏名,剩下的部分作为宏体。

不带参数的宏中,关键字#define后面出现一个连续字符序列作为宏标识符。

宏定义有文件作用域,不论宏定义出现在文件中的哪个地方,函数体内,类型定义内部,命名空间等,在它后面的任何地方都可以引用宏。

注意点:
1、宏定义不是c/c++语句,伪指令都不是c/c++指令,所以它们后面都不加分号;,如果加上了分号,分号就会成为宏的一部分,而在编译器不会认为宏中有分号是问题,所以不会报错,但是在编译时,宏标识全部被替换为宏体,此时的分号经常为代码带来编译错误。
2、任何宏在预编译处理阶段都是简单的文本替换,没有类型检查和语法检查,这个工作由编译器进行,因此宏体内可能会隐藏语法错误,参数替换发生在宏扩展之前。
3、宏定义可以嵌套,前面的标志宏可以出现在后面的标志宏的宏体中。

例如:

#define PI 3.14
#define PI2 (2*PI)

4、宏无法被调试,因为宏不会进入符号表,编译器创建符号表的时候,宏已经被预编译器生成为中间文件了,编译过程中宏是已经不存在了的,因此宏替换带来的错误无法被定位到宏定义中,而是被定位到源程序中。

宏体中出现了啥都不会报错

如果恰好宏体中包括了命名空间,那编译器会无法查看到该命名空间中的关键字与函数等导致大面积的报红,但是编译和运行不会有问题,这个经常会让人犯迷糊

5、程序里被双引号括起来的宏或包含宏的字符串在预处理过程中不会被替换。
6、定义带参数的宏时,宏名和做括号之间不能出现空格,否则其参数就会变成宏体,编译器不会发现任何问题,但编译过程中对替换后的结果肯定是有影响的,并且肯定无法按照预先的思路运行。
7、带参数的宏体的各个形参都应该用括号括起来,除了单个形参,整个宏体也要用括号括起来。
8、宏体内不应该有自增自减的操作,更不能把带参数的宏当做函数使用,因为宏虽然没有函数调用的开销,却有生成重复代码,使可执行代码.exe的体积增大的影响。
9、inline函数不会完全取代宏,因为功能上inline和宏是有区别的,一个是函数一个不是函数,只是功能上有相近之处而已。
10、不需要的宏可以用#undef来取消它的定义。

**具体写宏的注意点:
1、宏定义应该简洁清晰,意义明确,例如WIN32,WINDOWS
2、宏名采用大写字符组成的单词或其缩写序列,各单词之间使用下划线_分隔
3、需要被公布的宏应当放置在头文件中或定义文件的顶部。
4、定义新类型名时使用typedef,不应该用宏,否则容易造成错误。

typedef int LEVEL;

5、宏常量尽量用const取代。

const int MAXLEVEL = 100;//最高等级为一百

6、对于较长的,使用频率较高的重复代码片段,建议使用函数或模板;较短的代码可以使用带参宏定义。
7、全局宏定义在全局,局部宏定义在局部,但尽量避免局部范围定义宏,否则损害程序清晰性。**

伪指令-宏定义:使用#define定义一个宏,宏体中包含命名空间信息导致vs大量报红,但编译和运行却正常相关推荐

  1. 定义一个学生信息结构体,包含姓名,学号,语文成绩、数学成绩,和英语成绩,定义结构体数组存放不同学生的信息,可以在终端录入学生的信息,在基础上添加一个计算平均值和按照平均值排序以及删除指定学号的学生信息

    1. 代码如下: 头文件  chx.h #include<stdio.h> #include<string.h>struct chx{char name[128];int sn ...

  2. 【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)

    首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 ! 宏offsetof的介绍 : 参数:第一个是结构体类型名称,第二个是结构体成员名 返回类型:size_t无符号整形 引用的头文 ...

  3. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...

    结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好? typedef struct person{ char *name; int age; char sex[6]; }: 该结构体中nam ...

  4. 关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红

    关于IDM下载器,提示:一个假冒的序列号被用来注册-- 到C:\Windows\System32\drivers\etc 修改目录下面的hosts文件(如果没有修改的权限就右键属性hosts文件修改u ...

  5. Java实验——定义一个类,该类中包含以下几个方法(静态):实现两个字符串数组的逆序排序,输出结果为字符串数组;求两个整形数组的交集;求两个浮点型数组的并集;

    目录 一.实现两个字符串数组的逆序排序,输出结果为字符串数组 解题思路: 具体代码: 运行截图: 二.求两个整形数组的交集 具体代码: 运行截图: 三.求两个浮点型数组的并集 解题思路: 具体代码: ...

  6. 定义一个学生信息结构体,包含姓名,学号,语文成绩、数学成绩,和英语成绩,定义结构体数组存放不同学生的信息,可以在终端录入学生的信息,可以实现对于学生成绩的排序,排序可以按照语文、数学或者英语的任意一个

    1.代码实现 #include<stdio.h> #include<stdlib.h> #include<string.h>typedef struct stude ...

  7. 假设一个C语言程序中包含a=b c,C语言程序中a=b==c是什么意思

    首先因为"=="号比"="的优先级高,所以先执行b==c,明显b等2,c等3两者不等,所以为0(逻辑运算,当b不等c时这个等式的值就为假即是0),再执行a=0, ...

  8. 统计一个英文文本字符串中包含的英文原因字母的个数。

    原音字母:a, e , i , o , u. 代码: public class java_3_3 {public static void main(String[] args) {String tex ...

  9. #define 定义常量和宏,指针和结构体

    目录 #define 定义常量和宏 #define 定义常量 #define 定义宏 指针 内存 指针变量的大小 结构体 #define 定义常量和宏 #define 定义常量 在变量和常量2,#de ...

最新文章

  1. SAP MM 采购申请评估价格不能为0?
  2. golang map 排序
  3. mysql命令行执行时不输出列名(字段名)
  4. mysql lisensce_Linux之lldptool命令
  5. 操作系统04进程同步与通信
  6. C++使用流进行输入输出
  7. python队列精灵对战_python队列Queue
  8. 架构的坑系列:重构过程中的过度设计
  9. 第二章 如何在VS2008里面编译CG
  10. Oracle数户库、表导入导出
  11. Unity用UnityWebRequest,从服务器 下载图片
  12. Nginx出现大量499响应码怎么办?
  13. radix-tree算法浅析--从不懂到装懂
  14. Multi-Faceted Distillation of Base-Novel Commonality for Few-shot Object Detection
  15. BADUSB 橡皮鸭 键盘注入漏洞 USB协议漏洞
  16. nexus 6p刷android go,Nexus 6P刷入第三方Recovery获取Root权限教程
  17. 外接显示器音频输出自动静音
  18. 华为matebook d装双系统
  19. 赛灵思宣布收购深鉴科技
  20. 【转载】__declspec(dllimport) __declspec(dllexport)

热门文章

  1. aarch64安装numba
  2. matlab三维图、二维云图的可视化绘图
  3. Win10-自带修复系统DISM.exe工具
  4. FDTD仿真、解决微环透射率大于1 T大于1的问题
  5. 通过 Git 将代码提交到 GitHub(上)
  6. 数字电子技术实验作业(7)
  7. wordpress 形式php,将wordpress原生评论改造成论坛形式
  8. Dockerfile搭建wordpress论坛
  9. 博图当前项目包含冗余服务器组态,博途中WINCC组态问题
  10. html写表格最左最右的边框,excel怎么制作个人账本? excel账本的详细制作图文教程...