C中的宏和函数有什么区别?

时间:2011-02-14 09:06:04

标签: c function macros c-preprocessor

C 中的宏和函数有什么区别?请告诉我一个可以使用宏和函数的应用程序?

7 个答案:

答案 0 :(得分:23)

宏的优点和缺点

<强>优点

  • 时间效率。
  • 不需要像函数一样传递参数。
  • 经过预处理。
  • 易于阅读。

<强>缺点

  • 很难用大代码调试。
  • 与功能相比,在堆栈中占用更多内存。假设在程序中有一个使用了50次的宏,这意味着它会占用内存50次,但是如果一个函数被调用50次,它将每次占用一次内存,因为每次它释放该内存

答案 1 :(得分:20)

基本区别在于编译函数并预处理宏。当您使用函数调用时,它将被转换为ASM CALL,所有这些堆栈操作都传递参数和返回值。当您使用MACRO时,C预处理器将使用宏转换所有字符串而不是编译。

使用宏的缺点是它们隐藏了实现。如果有一个bug,就很难找到bug。

答案 2 :(得分:11)

在C(和C ++)中,宏是预处理器指令。这意味着在程序开始编译之前,它将遍历并处理所有宏。宏很有用,因为

  • 他们可以让您的程序更容易阅读
  • 他们可以提高效率(因为它们可以在编译时计算)
  • 它们可以缩短长时间使用的复杂表达式。例如,我们使用一个宏来获取当前的log4cpp记录器,另外几个用不同的级别写入它。

Disdvatages

  • 扩展可执行文件的大小
  • 如果不小心,可以淹没你的名字空间。例如,如果您有太多的预处理器宏,您可能会在代码中意外使用它们的名称,这可能会让调试变得非常混乱。

实施例

#define INCREMENT(x) x++

函数是一段代码,可以相对独立地执行并执行特定任务。您可以将其视为一种数学函数:给定一组输入的函数将给出特定的输出。在C中,这些被定义为

<return type> <name>(<parameters>)
{
  //code body
}

答案 3 :(得分:1)

您必须将宏视为文本替换:就像每次在代码中看到宏时内联宏代码一样。这对于“代码片段”很有用,因为你可以避免函数调用开销,因为每次调用函数时都需要将参数压入堆栈。

答案 4 :(得分:1)

另一个区别是在函数中存在堆栈开销,但是在宏的情况下没有堆栈开销;它只是代码的扩展。

答案 5 :(得分:-2)

函数是从的操作,即您通常认为程序操作的数据类型(数字,字符串等)。

宏是从代码代码的操作。它需要程序的一部分并使用它来为程序生成不同的部分。

C中的函数和宏之间没有重叠;他们不做同样的事情。 (你不能把一个函数从一个值写成代码;你不能,尽管有外表,从代码中写一个宏到一个值。我知道它看起来像你可以,但重要的是要明白这不是你真正的做。)

宏可以像函数一样,因为你可以编写一个宏来处理一段自己生成或代表一个值的代码,但那个宏仍然是对值本身进行操作:它采用值生成代码(可能是一个简单的数字)并将其编织成消耗代码的代码(这看起来像宏的“身体”。这意味着使用类似函数的宏非常容易混淆,而不是它们最适合用的。相反,函数单个离散代码块。

函数通常在运行时运行,而宏(在C中)总是在编译时运行这一事实只是由于值通常是动态的,而代码通常在运行时通常不可用的事实所造成的限制。它实际上不是函数或宏的基本方面(函数可以内联和优化;宏可以应用于动态生成的代码),并且有点像红色鲱鱼。

答案 6 :(得分:-2)

MACRO的优点是,我们只定义一次,如果我们想要更改价值,我们只能在一个地方进行更改,价值会反映在整个计划中。