C库双下划线混淆

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(或更早版本)标准中的保留字吗?

显然,我在某个地方搞错了,如果有人能为我解答这个问题,那就太好了。

1
https://dev59.com/iHM_5IYBdhLWcg3wRw51 的被接受答案至少涵盖了你问题的部分。 - Michael
@Michael 谢谢,这是我正在从中整合信息的其中之一,但我会重新阅读它。 - lynks
1个回答

3
  • 参数名称使用__,以避免与程序可能定义的宏发生冲突。另一种选择是完全省略声明中的参数名称。
  • 这里使用了strcpy,因为它是C库中声明的符号。
  • constrestrict关键字是受保护的,以防止某些人使用尚未实现它们的编译器。

啊,所以在前向声明中可以省略参数名?那么什么情况下会出现一个名为 __myfunction 的函数呢? - lynks
@lynks,是的,参数名称可以省略。函数如__myfunction将成为C库实现的“私有”函数,您不应直接使用它们,但由于某种原因必须作为外部函数可见。 - Jens Gustedt
谢谢,我会继续使用这些东西直到它们变得顺手。 - lynks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接