C 中的宏和函数有什么区别?请告诉我一个可以使用宏和函数的应用程序?
答案 0 :(得分:23)
<强>优点强>
<强>缺点强>
答案 1 :(得分:20)
基本区别在于编译函数并预处理宏。当您使用函数调用时,它将被转换为ASM CALL,所有这些堆栈操作都传递参数和返回值。当您使用MACRO时,C预处理器将使用宏转换所有字符串而不是编译。
使用宏的缺点是它们隐藏了实现。如果有一个bug,就很难找到bug。
答案 2 :(得分:11)
在C(和C ++)中,宏是预处理器指令。这意味着在程序开始编译之前,它将遍历并处理所有宏。宏很有用,因为
Disdvatages
实施例
#define INCREMENT(x) x++
函数是一段代码,可以相对独立地执行并执行特定任务。您可以将其视为一种数学函数:给定一组输入的函数将给出特定的输出。在C中,这些被定义为
<return type> <name>(<parameters>)
{
//code body
}
答案 3 :(得分:1)
您必须将宏视为文本替换:就像每次在代码中看到宏时内联宏代码一样。这对于“代码片段”很有用,因为你可以避免函数调用开销,因为每次调用函数时都需要将参数压入堆栈。
答案 4 :(得分:1)
另一个区别是在函数中存在堆栈开销,但是在宏的情况下没有堆栈开销;它只是代码的扩展。
答案 5 :(得分:-2)
函数是从值到值的操作,即您通常认为程序操作的数据类型(数字,字符串等)。
宏是从代码到代码的操作。它需要程序的一部分并使用它来为程序生成不同的部分。
C中的函数和宏之间没有重叠;他们不做同样的事情。 (你不能把一个函数从一个值写成代码;你不能,尽管有外表,从代码中写一个宏到一个值。我知道它看起来像你可以,但重要的是要明白这不是你真正的做。)
宏可以像函数一样看,因为你可以编写一个宏来处理一段自己生成或代表一个值的代码,但那个宏仍然是不对值本身进行操作:它采用值生成代码(可能是一个简单的数字)并将其编织成消耗代码的代码(这看起来像宏的“身体”。这意味着使用类似函数的宏非常容易混淆,而不是它们最适合用的。相反,函数是单个离散代码块。
函数通常在运行时运行,而宏(在C中)总是在编译时运行这一事实只是由于值通常是动态的,而代码通常在运行时通常不可用的事实所造成的限制。它实际上不是函数或宏的基本方面(函数可以内联和优化;宏可以应用于动态生成的代码),并且有点像红色鲱鱼。
答案 6 :(得分:-2)
MACRO的优点是,我们只定义一次,如果我们想要更改价值,我们只能在一个地方进行更改,价值会反映在整个计划中。