c - 解释qsort中的C代码行

标签 c syntax qsort

我一直在研究 qsort 的不同实现,在此处找到的源代码中有一行 ( https://code.woboq.org/userspace/glibc/stdlib/qsort.c.html ) 我不明白。它看起来像一个函数指针声明。我将不胜感激任何帮助。我已经包含了尽可能多的代码(带有注释的行),以回答我认为的问题。如果没有请告诉我,谢谢。

typedef struct
{
    char *lo;
    char *hi;

} stack_node;


void _quicksort (void *const pbase, size_t total_elems, size_t size, cmp_t cmp, void *arg)
{

    char *base_ptr = (char *) pbase;

    const size_t max_thresh = 4 * size;

    if (total_elems == 0)

        return;

    if (total_elems > 4)
    {
        char *lo = base_ptr;
        char *hi = &lo[size * (total_elems - 1)];
        stack_node stack[(8 * sizeof(size_t))];
        stack_node *top = stack;

        /* Line below is a function pointer declaration?  Initializes struct? */

        ((void) ((top->lo = (((void*)0))), (top->hi = (((void*)0))), ++top));

        while ((stack < top))
        {
            char *left_ptr;
            char *right_ptr;

            char *mid = lo + size * ((hi - lo) / size >> 1);

...代码继续

最佳答案

不,它不是函数指针声明。这只是一种复杂的说法

top->lo = 0;
top->hi = 0;
++top;

您可以使用 , 运算符将上面的内容重写为单个表达式语句

top->lo = 0, top->hi = 0, ++top;

然后添加不必要的转换

top->lo = (void *) 0, top->hi = (void *) 0, ++top;

和一堆多余的()

(top->lo = (((void *) 0))), (top->hi = (((void *) 0))), ++top;

然后将整个内容转换为 (void)(例如,抑制任何关于表达式结果“未使用”的潜在编译器警告)

((void) ((top->lo = (((void *) 0))), (top->hi = (((void *) 0))), ++top));

现在您有了原始版本。

为什么有人决定将这种奇怪的语法与 运算符和大量冗余的 () 一起使用,我不清楚。看起来像宏扩展。也许它是一段已经预处理过的代码? ((void *) 0) 部分可能很容易成为标准 NULL 宏的预处理器替换。

关于c - 解释qsort中的C代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603114/

相关文章:

c - 函数 shmdt() 有什么问题?

c++ - 了解警告 : binding r-value to l-value reference

php - pdo 准备好的声明不起作用

c - 需要帮助将 qsort 与结构数组一起使用

c - c中多维数组的qsort导致段错误

c - 'long' 之前的预期表达式

c++ - 在 C 或 C++ 应用程序中使用 @

c++ - 寻找一个开源的 C/C++ 图像/视频缩略图生成库

python - 我的 JSON 对象有什么问题?

arrays - C 编程语言中的 qsort 函数如何工作