【发布时间】:2020-11-30 02:55:41
【问题描述】:
具有 '__P' 的 socket.h BSP 标头
int 绑定 __P((int, const struct sockaddr *, socklen_t))
你能告诉我这里的“__P”是什么意思吗?非常感谢!
【问题讨论】:
具有 '__P' 的 socket.h BSP 标头
int 绑定 __P((int, const struct sockaddr *, socklen_t))
你能告诉我这里的“__P”是什么意思吗?非常感谢!
【问题讨论】:
这是一个可移植性黑客。 K&R C(C 之前的版本被 ANSI 和 ISO 标准化)没有在括号中声明具有类型和命名参数的函数。因此,这个声明需要在 K&R C 上是这样的:
int bind();
这在标准 C 上:
int bind(int, const struct sockaddr *, socklen_t);
__P 宏旨在掩盖这些差异,并允许编译器根据指定标准 C 的 __STDC__ 宏的存在生成适当的原型。
请注意,C 在 1989 年被 ANSI 标准化,在 1990 年被 ISO 标准化,并且从那时起经历了几次修订,最显着的是在 1999 年和 2011 年。几乎不可能有人仍在现代计算机上使用 K&R C 编译器系统,因为对于许多架构来说,它们对相关操作系统的支持只出现在支持标准 C 的编译器中。而且,大多数人使用的系统是在过去 30 年中升级或构建的。
但是,一些非常古老的软件可能是用 K&R C 编写的,因此,这种技术允许这样的代码工作。但是,此类代码的生命周期必然是有限的,因为最新版本的 GCC 和 clang 不再支持 K&R C,因此寻找旧的编译器可能会很棘手。
【讨论】: