我已经阅读了我能找到的所有关于此的问题,但还没有人解决我的困惑。
如果我理解正确,在库代码中的方法或变量名称开头使用双下划线只是命名空间约定。它允许操作系统代码避免与任何应用程序代码发生冲突。
那么,为什么我/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
或类似)中访问时,并且永远不会与我的代码冲突。(顺便说一句,我从来没有真正理解为什么前向声明需要参数名称,仅类型就足够了吗?)为什么函数名不是
__strcpy
?string.h
算不算操作系统的一部分?为什么将单词
const
和restrict
更改为使用双下划线?它们不是已经在 C99(或更早版本?)标准中保留字了吗?
显然,我的电线在某处交叉,如果有人能为我解决这个问题,那就太好了。