标题中的宏函数与静态函数


9

对于许多可以使用函数的快速任务f(x,y),在纯C中使用宏。我想具体询问这些情况,这些情况可以通过函数调用解决(即,用于内联函数的宏,而不是用于任意代码的代码扩展的宏)。

通常不内联C函数,因为它们可能是从其他C文件链接到的。但是,静态C函数仅在定义它们的C文件中可见。因此,编译器可以内联它们。我听说,应该将许多宏替换为静态函数,因为它们会生成更安全的代码。

在某些情况下这不是一个好主意吗?

再说一遍:根本不问具有完全无法表示为函数的具有##相似构造的Code-Production宏。



编写适当的宏很痛苦,inlineing函数只能确保可以在二进制文件中多次定义它,编译器可以决定是否实际上将其内联以节省空间
棘手的怪癖

2
我实际上会怀疑其中大多数是历史原因。以前,C编译器根本没有内联函数。因此人们将宏用于需要内联的事情。C代码通常寿命很长。
Jan Hudec

@ratchetfreak:C没有inline,这与C ++无关。
wirrbel

2
@wirrbel当然inline在C中,至少从C99开始。有关快速概述,请参见Wikipedia的内联函数
阿蒙(Amon)

Answers:


6

可通过函数调用解决的宏有很多陷阱:

  • 它们很难编写,因为您可能必须正确处理类似的参数++i
  • 使用视觉调试器很难调试它们,因为您无法单步执行宏或在其中放置断点。
  • 分析编译依赖项时,它们很难正确处理。

通过函数调用可解决的宏在提供原始编译器中的内联时可能很有用。我不知道任何编译器不处理内联函数,有些甚至可以跨编译单元内联。

通常不内联C函数,因为它们可能是从其他C文件链接到的。

没有理由为什么编译器不能提供一个函数的两个版本,一个传统的called 版本和一个inlined版本。您应该查看目标编译器的文档。另外,您可能希望查看生成的程序集:即使您不知道程序集,也可以快速学会判断是否已内联某些函数。(从婴儿示例开始,以快速了解这一点。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.