C++宏定义和内联函数的区别,宏定义和typedef的区别

1.1k 词

参考:
https://csguide.cn/

宏定义(#define)和内联函数(inline)都是为了减少函数调用开销和提高代码运行效率而引入的机制,但是它们的实现方式和作用机制略有不同。

宏定义(#define)和typedef都是C++语言中用于定义别名的方法。

define

在C/C++中,#define时预处理指令的一种。

一般用于定义宏,主要有两种用途:

  • 定义常量
  • 创建宏函数

无论是哪种都是用于在编译时替换文本,也就是define实际上只做文本的替换,可以使用gcc -E查看宏替换后的结果。

写宏函数一定要注意,参数和函数体应当用括号包围,避免因运算优先级导致的错误。

inline

内联函数的定义和普通函数类似,只需在函数声明前加上inline关键字即可。

但是编译器并不一定会将所有声明为内联函数的函数都进行内联,是否内联取决于编译器的实现和优化策略。

内联函数的优点是类型安全、可调式、可优化,但是也存在一些问题。

由于函数体会被复制多次,会占用更多的代码段空间,而且在某些情况下可能会导致代码膨胀。

宏定义与内联函数区别

语义

宏定义使用预处理器指令#define定义。

它在编译期间将宏展开,并替换宏定义中的代码。

预处理只进行简单的文本替换,不涉及类型检查。

内联函数使用inline关键字定义,他是一个真正的函数。

编译器会尝试将内联函数的调用处用函数体进行替换,从而避免函数调用的开销。

类型检查

宏定义就是单纯的字符替换,不涉及类型检查,容易导致错误。

内联函数会进行类型检查,更加安全。

内联函数可以进行调试,而宏定义不行

宏可能导致不合理计算

在inline函数传递参数只计算一次,而在使用宏定义的情况下,每次在程序中使用宏都会计算表达式参数。可能导致宏对表达式参数重复多次计算。

1
2
3
4
#define Max(a, b) ((a)>(b)?(a):(c))

int x = 1;
int y = Max(x++, 10); // (x++)>(10)?(x++):10,可能导致x重复+1.

宏定义与typedef的区别

语义和实现机制

宏定义在编译期间将宏展开,并替换宏定义中的代码。

typedef是一种类型定义关键字,用于为现有类型创建新的名称。

与宏定义不同,typedef是在编译阶段处理的,有更严格的类型检查。

作用域限制

宏定义没有作用域限制,只要在宏定义之后的地方,就可以使用宏。

通常用于定义常量、简单的表达式或简单的代码片段。

typedef遵循C++的作用域规则,受到命名空间、类等结构的作用域限制。

通常用于定义复杂类型的别名,使代码更易读和可维护,如:

模板支持

宏定义不支持模板,typedef可以与模板结合,但在C++11之后,推荐使用using关键字定义模板类型别名。

留言