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

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

宏的优点和缺点

好处

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

缺点

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

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

减少使用宏是因为它们隐藏了实现。 如果有一个bug,它更难找到bug。

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

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

Disdvatages

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

#define INCREMENT(x) x++ 

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

  () { //code body } 

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

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

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

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

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

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

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

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