由于平时在开发过程中,经常有遇到使用宏、常量的时候。但是一直对这两者的使用有些疑惑。尤其是对const的使用更加模糊,只知道该修饰符有很多种用法,位置不同含义不同。所以特意查询了一下,为了以后方便自己查阅特此记录一下。
宏、常量、变量
1、宏
1.1、宏的概念
宏就相当于是文本替换操作,是编译期语法,并不会占用到内存,因为实质上它根本就不存在于程序中。只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,如果是整形、浮点型会有多份拷贝,但这些数写在指令中。占的只是代码段而已,大量用宏会导致二进制文件变大。
1.2、宏的几种用法
a.宏函数:实质上就是文本替换,只不过这里的替换文本是函数
b.条件编译(宏值编译、宏是否定义编译):借助宏的条件指令,选择性执行代码
c.简单文本替换:替换文本内容并非函数,是一些简单的常量常量等。比如字符串等
1.3、语法格式和条件编译指令
语法格式:#define 宏文本 替换文本
常用的条件指令:
#if 如果 宏值判断a
#ifdef 如果定义 根据宏是否定义b
#ifndef 如果没定义
#elif 如果 //else if
#else 否则 与 #if 对应关系
#endif 结束标识
#undef 取消宏和#define 定义宏
1.4、使用示例
宏函数:
条件编译:
简单文本替换:
#define Pi 3.14