欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++中宏定义的优缺点

程序员文章站 2024-03-21 13:40:46
...

先来看一看宏定义:

define 标识符 字符串

1#define命令属于“预处理命令”中的一种。它是由C++统一规定的,但非C++语言本身的组成部分,由于编译器无法识别他们,不能对其直接进行编译。预处理过程必须在对程序进行词法与语义分析、代码生成与优化等通常的编译过程之前进行,经过预处理后的程序不再包含之前的预处理命令。
C++提供的预处理功能除了宏定义之外,还有以下两个:
1. 文件包含(#include命令)
2. 条件编译(#ifdef …. #def …. #endif命令)

,#define命令还可以定义带参数的的宏定义,用于实现某种特定的功能:
,#define Sum(a,b) a+b
不过,由于C++增加了内联函数,实现起来比带参数的宏方便,这样的宏在C++中已经很少使用了。

宏的优势:
1. 提高了程序的可读性,同时也方便进行修改;
2. 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率;
3. 宏是由预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。比如##连接符。
宏的缺点:
1. 由于是直接嵌入的,所以代码可能相对多一点;
2. 嵌套定义过多可能会影响程序的可读性,而且很容易出错;
3. 对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。
补充:预编译语句仅仅是简单的值替换,缺乏类型的检测机制。这样预处理语句就不能享受C++严格类型检查的好处,从而可能引发一系列错误的隐患。

宏定义多条语句可以用如下的形式进行定义:

#define swap(a,b) { a = a + b;  b = a - b;  a = a - b; }
// 如果分行写,可以写成如下形式
 #define swap(a,b) { a = a + b;\
 b = a - b;\
 a = a - b;}

宏定义一般分为带参宏定义和不带参宏定义。
带参宏定义,也即带参数的宏定义,如:

#define MAX(a,b) ((a)>(b) ? (a) : (b))

不带参宏定义,也即不带参数的宏定义,如:

#define PI 3.14159   // 定义圆周率pi的值

https://www.cnblogs.com/liushui-sky/p/6423202.html