C ++中内联和宏之间的区别

作者: Laura McKinney
创建日期: 2 四月 2021
更新日期: 16 可能 2024
Anonim
RustChinaConf2020 - Game Engine Development with Rust by Zhang Runzhe
视频: RustChinaConf2020 - Game Engine Development with Rust by Zhang Runzhe

内容


宏是在调用时扩展的指令。也可以定义函数,例如宏。同样,内联函数在调用时也会扩展。内联函数和宏函数之间的主要区别是 内联函数 在扩展 汇编巨集 当程序由 预处理器.

让我们借助比较表研究内联和宏之间的区别。

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较表

比较基础排队巨集
基本的 内联函数由编译器解析。宏由预处理器扩展。
句法内联return_type funct_name(参数){。 。 。 }#定义宏名char_sequence
使用关键字排队
#限定
已定义它可以在类的内部或外部定义。它总是在程序开始时定义。
评价它仅对参数求值一次。每次在代码中使用参数时,它都会评估参数。
扩张 编译器可能未内联并扩展所有功能。宏总是被扩展。
自动化在类内部定义的短函数会自动转换为内联函数。宏应特别定义。
存取中内联成员函数可以访问类的数据成员。宏永远不能是该类的成员,并且不能访问该类的数据成员。
终止内联函数的定义以内联函数结尾的花括号结束。宏的定义以新行结束。
调试对于内联函数,调试很容易,因为在编译过程中会进行错误检查。对于宏来说,调试变得很困难,因为在编译过程中不会进行错误检查。
捆绑内联函数将函数主体中的所有语句很好地绑定在一起,并且函数主体以大括号开头和结尾。如果宏具有多个语句,则它会遇到绑定问题,因为它没有终止符号。


内联的定义

内联函数看起来像常规函数,但是前面加上关键字“排队”。内联函数是短长度的函数,在调用时会进行扩展,而不是被调用。让我们通过一个例子来了解内联函数。

#包括 使用名称空间std;类示例{int a,b; public:内联void initialize(int x,int y){a = x; b = y} void display(){cout << a <<“” <

在上面的程序中,我声明并定义了函数initialize()作为类“ example”中的内联函数。 initialize()函数的代码将在由“ example”类的对象调用的地方扩展。在类example实例中定义的display()函数未声明为内联,但编译器可将其视为内联,例如在C ++中,考虑到函数的长度,编译器会自动将类内部定义的函数内联。

  • 内联函数减少了函数调用和返回的开销,从而减少了程序的执行时间。同样,将参数压入堆栈,并在调用函数时保存寄存器,并在函数返回时重置寄存器,这需要时间,内联函数避免了这种情况,因为无需每次都创建局部变量和形式参数。
  • 内联函数可以是该类的成员,也可以访问该类的数据成员。
  • 内联函数减少了程序的执行时间,但是,有时,如果内联函数的长度更大,则由于重复的代码,程序的大小也会增加。因此,内联非常小的函数是一个好习惯。
  • 内联函数的参数仅计算一次。

宏的定义

宏是“预处理程序指令”。在编译之前,该程序将由预处理程序进行检查,无论在程序中的哪个位置找到宏,它都会通过其定义替换该宏。因此,宏被视为“替换”。让我们以一个例子来研究宏。

#包括 #define GREATER(a,b)((a <b)?b:a)int main(void){cout <<“ 10和20中的较大者是<< << GREATER(“ 20”,“ 10”)<< “ n”;返回0; }

在上面的代码中,我声明了一个宏函数GREATER(),该函数比较并发现两个参数的数量更多。您可以观察到没有分号来终止宏,因为宏仅由新行终止。由于宏只是替换,因此它将在调用宏的地方扩展其代码。


  • 宏始终以大写字母定义,以使程序员在阅读时可以轻松识别程序中的所有宏。
  • 宏永远不能是类的成员函数,也不能访问任何类的数据成员。
  • 每次在定义中出现参数时,宏函数都会对参数求值,这会导致意外结果。
  • 宏的大小必须较小,因为较大的宏会不必要地增加代码的大小。
  1. 内联和宏之间的基本区别在于,内联函数由编译器解析,而程序中的宏由预处理器扩展。
  2. 用于定义内联函数的关键字是“排队”,而用于定义宏的关键字是“#限定“.
  3. 一旦内联函数在类内部进行了贴花处理,就可以在类内部或类外部对其进行定义。另一方面,总是在程序开始时定义宏。
  4. 传递给内联函数的参数在编译时仅被评估一次,而每次在代码中使用宏时,都会对macros参数进行评估。
  5. 编译器不能内联和扩展类中定义的所有功能。另一方面,宏总是被扩展。
  6. 在没有inline关键字的类中定义的short函数将自动成为inline函数。另一方面,应专门定义宏。
  7. 内联函数可以访问该类的成员,而宏则永远不能访问该类的成员。
  8. 要终止内联函数,需要使用闭合的花括号,而宏则以新行的开头终止。
  9. 对于inlne函数,调试变得容易,因为在编译过程中会检查是否有任何错误。另一方面,在编译时不检查宏,因此调试宏变得困难。
  10. 作为函数,内联函数将其成员绑定在开始和闭合花括号内。另一方面,宏没有任何终止符号,因此,当宏包含一个以上的语句时,绑定变得很困难。

结论:

内联函数比宏函数更具说服力。 C ++还提供了一种更好的定义常量的方法,该常量使用“ const”关键字。