Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C库双下划线混淆_C_Namespaces_Header Files_Conventions - Fatal编程技术网

C库双下划线混淆

C库双下划线混淆,c,namespaces,header-files,conventions,C,Namespaces,Header Files,Conventions,我已经阅读了所有关于这一点的问题,但还没有人解决我的困惑 如果我理解正确,在库代码中方法或变量名的开头使用双下划线只是一种名称空间约定。它允许操作系统代码避免与任何应用程序代码冲突 那么,为什么我的/usr/include/string.h包含以下函数声明 extern char *strcpy (char *__restrict __dest, __const char *__restrict __src) __THROW __nonnull ((1, 2)); 忽略\uuuuuu抛

我已经阅读了所有关于这一点的问题,但还没有人解决我的困惑

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

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

extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
    __THROW __nonnull ((1, 2));
忽略
\uuuuuu抛出
\uuuuu非空((1,2))部分,我有以下问题

  • 为什么它们对局部变量名
    \uu dest
    \uu src
    使用双下划线,而这些变量名肯定只能由实现访问(可能是在
    string.c
    或类似文件中),并且永远不会与我的代码冲突。(顺便说一句,我从来没有真正理解为什么转发声明需要参数名,光是类型还不够吗?)

  • 为什么函数名不是
    \uu strcpy
    string.h
    是否不算作操作系统的一部分

  • 为什么单词
    const
    restrict
    被改为使用双下划线?在C99(或更早版本?)标准中,它们不是已经保留了字吗

很明显,我在这条线路的某个地方遇到了麻烦,如果有人能帮我解决这个问题,那就太好了。

  • 参数名称与
    \uuu
    一起使用,这样它们就不会与 程序可能已定义的宏。另一种选择是在声明中完全省略参数名
  • 它是strcpy,因为它是(C库的)符号 在此声明
  • const
    restrict
    关键字受到保护,以防有人 使用尚未实现它们的编译器

已接受的答案至少涵盖了您问题的一部分。@Michael,谢谢,这是我从中拼凑信息的答案之一,但我会重新阅读。啊,这样就可以从转发声明中删除参数名称了吗?当我看到一个名为
\uu myfunction
?@lynks的函数时,是的,参数名可以省略。作为
\uuu myfunction
的函数将是C库实现的“私有”函数,您不应该直接使用这些函数,但出于某种原因,它们必须作为外部函数可见。谢谢,我将继续使用这些函数,直到它们单击为止。