Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
理解glibc源代码约定_C_Pthreads_Libc - Fatal编程技术网

理解glibc源代码约定

理解glibc源代码约定,c,pthreads,libc,C,Pthreads,Libc,我一直在看glibc的一些源代码,特别是nptl代码,我发现它有点难以理解,因为它似乎有一些我不熟悉的约定 例如,我在看一个非常小的文件,有几件事我有疑问: 22 int 23 __pthread_equal (thread1, thread2) 24 pthread_t thread1; 25 pthread_t thread2; 26 { 27 return thread1 == thread2; 28 } 29 strong_alias (__pthread_equ

我一直在看glibc的一些源代码,特别是nptl代码,我发现它有点难以理解,因为它似乎有一些我不熟悉的约定

例如,我在看一个非常小的文件,有几件事我有疑问:

22 int
23 __pthread_equal (thread1, thread2)
24      pthread_t thread1;
25      pthread_t thread2;
26 {
27   return thread1 == thread2;
28 }
29 strong_alias (__pthread_equal, pthread_equal)
  • 第22行和第23行的声明看起来像是我理解的东西。它的返回类型为
    int
    ,然后是函数名
    \uuu pthread\u equal
    和参数列表
    (thread1,thread2)
    。但是第24行的声明是什么和25
    pthread\u t thread2用于?看起来这些都被声明为全局变量,但我不理解其目的。我在nptl目录中的许多文件中都看到过这种模式,但我还不知道为什么会这样做

  • 什么是
    strong\u别名
    ?一个快速的谷歌搜索有这样的例子,但我没有找到任何文档的链接

  • 为什么要在某些名称前面加两个下划线,而在某些名称前面加一个下划线。我看到的大多数代码都使用了两个下划线,但我想我已经看到一些地方使用了一个下划线。例如在

  • 诚然,代码的开头有一条注释,上面写着“旧的清理接口”,但不管怎样,我都很好奇它们之间的区别,以及为什么有时使用一个下划线,有时使用两个下划线

    请提供有关这些问题的任何信息

  • 古老的文字
  • 为确保
    \u pthread_equal
    的类型相同,
    pthread_equal
  • 区分变量名,区分核心区和用户区

  • 该函数的编写不需要C89兼容编译器;它也适用于较旧的编译器。这是一个非原型函数定义

    int   /* Return type */
    function(arg1, arg2)    /* Function name and argument names (but no types) */
        int arg1;    /* Type of arg1 */
        char *arg2;  /* Type of arg2 */
    {
        /* Body of function */
    }
    
    请注意,参数的定义不必与函数行中的顺序相同(我必须将代码从这个“K&R”符号转换为原型符号,因为它们的顺序不正确!)。还请注意,过去可以简单地写:

    main(argc, argv)
        char **argv;
    {
        ...
    }
    
    argc
    的隐含类型是
    int
    ,因为它没有被指定为任何其他类型。
    glib
    代码不太可能利用该许可证。类似地,
    main()
    的返回类型是
    int
    ,因为没有给出其他类型

    strong\u别名
    与隐藏和公开共享库中的符号有关。我没有使用它,所以我不确定所有的结果,但我相信这意味着
    \uuupthread\uequal()
    pthread\uequal()函数的另一个名称


    \uu pthread_equal()
    名称背后的一个原因是,以下划线开头,后跟大写字母或另一个下划线的名称由C标准“保留给实现”。根据C标准,“pthread_equal()”等名称位于用户的名称空间中

    ISO/IEC 9899:1990(C99标准)规定:

    7.1.3保留标识符 每个标题声明或定义其关联子标题中列出的所有标识符,以及 (可选)声明或定义在其关联的未来库方向中列出的标识符 子用途和标识符,始终保留用于任何用途或用作文件 作用域标识符

    -以下划线和大写字母或其他字母开头的所有标识符 下划线始终保留供任何使用

    -所有以下划线开头的标识符始终保留用作标识符 文件范围在普通和标记名空间中

    -以下任何子类(包括未来库)中的每个宏名称 如果包含任何相关标题,则按照规定保留使用; 除非另有明确规定(见7.1.4)

    -以下任何子条款中具有外部链接的所有标识符(包括 未来库方向)始终保留用作外部库的标识符 联系(第154段)

    -以下任何子条款中列出的具有文件范围的每个标识符(包括 保留将来的库方向)以用作宏名称和标识符 如果包含任何关联的标头,则文件作用域位于相同的名称空间中

    没有保留其他标识符。如果程序在 保留的上下文(7.1.4允许的除外),或定义保留 标识符作为宏名称,行为未定义

    154)具有外部链接的保留标识符列表包括
    errno
    math\u errhandling
    setjmp
    va_end

    main(argc, argv)
        char **argv;
    {
        ...
    }