宏属于预处理命令的一种
预处理命令: 在编译之前进行的处理,编译工作的任务之一就是语法检查,预处理不做语法检查。
包含:1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。
宏定义:又称为宏代换、宏替换,简称“宏”,可进行字符串替换和参数替换
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)宏定义末尾不加分号,否则分号会被一起替换
(4)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头
(5)可以用#undef命令终止宏定义的作用域
(6)宏定义允许嵌套
(7)宏定义不分配内存,变量定义分配内存
(8)宏定义不存在类型问题,它的参数也是无类型的
宏函数与内联函数
1、 宏函数的参数无类型
2、 宏函数仅进行参数的字符串代换,不会做参数运算
#define TABLE_MULTI(x) (x*x)
TABLE_MULTI(10)------>10 //正确
TABLE_MULTI(10+10) ------>10+10*10+10 //歧义
#defineTABLE_MULTI(x) ((x)*(x))
TABLE_MULTI(a++) ------> (a++)*(a++)------>a=4,5*6=30 //歧义
3、 宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的
4、 在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字
注意:C++(VS)中的NULL就是0的宏定义,指针为NULL/0表示不指向任何对象。