C中宏与函数的区别是什么?请告诉我一个可用宏和函数的应用场景。
基本的区别在于函数是编译过程中处理的,而宏是预处理过程中处理的。当你使用函数调用时,它将被翻译成带有所有这些堆栈操作以传递参数和返回值的ASM CALL。当你使用宏时,C预处理器将使用宏来翻译所有字符串,然后进行编译。
使用宏的缺点是它们隐藏了实现细节。如果有错误,那么查找起来会更加困难。
C 和 C++ 中,宏是预处理器指令。这意味着在程序开始编译之前,将会遍历并处理所有宏定义。宏定义有用的原因是:
缺点
示例:
#define INCREMENT(x) x++
函数是一段代码,可以相对独立地执行并执行特定的任务。您可以将其视为数学函数的一种:给定一组输入,函数将给出一个特定的输出。在C语言中,这些被定义为
<return type> <name>(<parameters>)
{
//code body
}
函数是从值到值的操作,即程序通常处理的数据类型(数字、字符串等)。
宏是从代码到代码的操作。它获取程序的一部分并使用它来生成程序的另一部分。
C语言中函数和宏之间完全没有重叠;它们不做相同的事情。(您不能编写从值到代码的函数;尽管外观上看起来可以编写从代码到值的宏,但重要的是要理解这实际上不是您正在做的事情。)
宏可以被制作成类似于函数的形式,因为你可以编写一个宏来处理生成或表示值的代码片段,但是该宏仍然不会操作值本身:它将“生成值的代码”(可能是一个简单的数字)编织到“消耗值的代码”中(这就是宏的“主体”所看起来的东西)。这意味着像函数一样使用宏非常令人困惑,也不是宏最好的用法。相比之下,函数实际上是一个单独的离散代码块。
函数通常在运行时运行,而宏(在C中)始终在编译时运行,这只是由于值通常是动态的,而代码通常在运行时不可用的限制所导致的。这实际上并不是函数或宏的基本特征(函数可以内联和优化掉;宏可以应用于动态生成的代码),并且有点误导性。
2
和2
相加得到2+2
。这是核心区别。绝对所有其他内容都是附带的/实现细节/特定于C 文化。相反,暗示宏和内联之间的任何关系都是混淆这个主题的例子。 - Alex Celeste