【发布时间】:2022-09-27 23:10:36
【问题描述】:
每个人都知道经典的#define DEFAULT_VALUE 100 宏,其中预处理器只会找到“令牌”并将其替换为任何值。
我遇到的问题是理解这个#define my_puts(x) puts(x) 的功能版本。我面前有 K&R,但我根本找不到合适的解释。例如:
- 为什么我需要提供参数的数量?
- 为什么他们的名字可以是什么?
- 为什么我不必提供类型?
但主要是我想知道这个替换是如何在幕后发挥作用的。
在我的脑海里,我想我记得有人在某处说这很糟糕,因为没有类型。
简而言之,我想知道使用宏重命名函数是否安全可靠(而不是手动将函数包装在另一个函数中)。
谢谢!
-
你问为什么
#define my_puts(x) puts(x)而不是#define my_puts puts? -
一个常见的例子是在进行网络编程时,并希望在 Windows 和 e.g. Linux。在 Linux 上关闭网络连接的函数是
close,在 Windows 上是closesocket。它们都采用“socket”参数,所以为了便携,可以使用条件编译定义像my_close_socket这样的宏,它使用close或closesocket,具体取决于系统。 -
也可能存在标准函数接受 X 参数的情况,但程序只会使用
X - n参数,其余的都是一些默认值。然后可以创建一个只接受X - n参数的宏,它扩展为传递所有\'X\' 参数的真实函数。 -
除了这些情况,这种宏几乎没有什么原因。
-
您是否搜索过“类似函数的 C 宏”?应该有很多解释......无论如何,预处理器与 C 编译器是不同的野兽。因此,它对数据类型一无所知。
标签: c