【问题标题】:BSD socket headerBSD 套接字头
【发布时间】:2020-11-30 02:55:41
【问题描述】:

具有 '__P' 的 socket.h BSP 标头

int 绑定 __P((int, const struct sockaddr *, socklen_t))

你能告诉我这里的“__P”是什么意思吗?非常感谢!

【问题讨论】:

    标签: linux sockets bsd


    【解决方案1】:

    这是一个可移植性黑客。 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,因此寻找旧的编译器可能会很棘手。

    【讨论】:

    • 感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多