我已经阅读了所有关于这个问题的问题,但是没有人解决我的困惑。
如果我理解正确,在库代码中在方法或变量名称的开头使用双下划线只是一种命名空间约定。它允许操作系统代码避免与任何应用程序代码发生冲突。
那么,为什么我的/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(或更早版本)标准中的保留字吗?