预处理之宏定义

还记得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之前的语句。

原文地址:https://www.cnblogs.com/luoyang0515/p/10246580.html