我已经阅读了有关此问题的所有问题,但没有人解决我的困惑。

如果我理解正确,则在库代码中的方法或变量名的开头使用双下划线只是一个命名空间约定。它允许操作系统代码避免与任何应用程序代码冲突。

那么,为什么我的/usr/include/string.h包含例如以下函数声明;

extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
    __THROW __nonnull ((1, 2));

忽略__THROW__nonnull ((1, 2));部分,我有以下问题;
  • 为什么要对本地变量名称__dest__src使用双下划线,但是肯定只能通过实现来实现(大概是string.c或类似名称),并且决不能与我的代码冲突。 (顺便说一句,我从来没有真正理解过为什么前向声明需要参数名称,仅类型本身就不够吗?)
  • 为什么函数名称不是__strcpystring.h是否不算作操作系统的一部分?
  • 为什么将constrestrict单词更改为使用双下划线?他们不是已经在C99(或更早版本)的标准中保留字了吗?

  • 显然,如果有人可以帮我解决这个问题,那我的电线就已经沿着线交叉了。

    最佳答案

  • 参数名称带有__,因此它们不会与
    程序可能已经定义的宏。另一个选择是完全从声明中省略参数名称。
  • 这是strcpy,因为这是(C库的)符号,
    在这里声明
  • 有人保护constrestrict关键字
    使用尚未实现它们的编译器。
  • 07-24 18:53