3

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

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

那么,为什么我/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(或更早版本?)标准中保留字了吗?

显然,我的电线在某处交叉,如果有人能为我解决这个问题,那就太好了。

4

1 回答 1

3
  • 参数名称与__程序可能定义的宏不冲突。另一种选择是从声明中完全省略参数名称。
  • 这是strcpy因为这是这里声明的(C 库的)符号
  • constandrestrict关键字受到保护,以防有人使用尚未实现它们的编译器。
于 2013-04-03T13:51:50.170 回答