还记得C++预处理的三种形式吗?条件编译、文件包含、宏定义。今天来总结一下宏定义。
宏定义(或者宏替换、宏代换),包含两种用法,含参和不含参,其中含参类似函数。
#define 宏名 字符串
#define 宏名(参数列表) 字符串
注意宏名的命名遵循标识符的命名规则。
定义一个宏后,编译器会在预编译时将宏名代换,这个过程称为宏展开。
至于宏定义的好处就不多说了,方便修改、增加程序可读性blablabla,书上自己看QwQ
宏的使用包括含参和不含参两种用法,在此列出它们在使用的时候的一些注意点。
1、宏名大写;
2、因为宏展开在预处理的时候进行,因此编译的时候不会检查宏的语法,即使有错误也能通过编译;
3、定义末尾不加分号;
4、宏定义通常在文件开头,之后的程序都为其作用域;
5、#undef用于终止宏定义的作用域;
6、宏定义可以嵌套;
7、如果宏名在" "中,则被处理为字符而非宏,因此不会被替换;
8、宏定义不占用内存;
9、宏展开不占运行时间,占用编译时间,而函数调用占用运行时间;
10、宏展开只单纯进行替换,要注意替换后的计算顺序,必要时在宏定义时加上括号;
有以下代码:
1 #include <iostream> 2 #define S(a,b) a*b 3 #define P(r) r*r 4 using namespace std; 5 int main(){ 6 cout<<S(2,8)<<endl; //输出16 7 cout<<S(2+3,8)<<endl; //输出26,替换后为(2+3*8) 8 cout<<P(3)<<endl; //输出9 9 cout<<P(3+5)<<endl; //输出23,替换后为(3+5*3+5) 10 return 0; 11 }
顺便提一下条件编译
#if 编译预处理中的条件命令,相当于C语法中的if语句
#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef 与#ifdef相反,判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
用的比较多的还是#ifdef,通常紧跟着#endif
表示如果#ifdef后的宏名如果被定义了,便执行#ifdef和#endif之前的语句。