在qsort中解释C代码行

Cor*_*man 4 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);
Run Code Online (Sandbox Code Playgroud)

...代码还在继续

AnT*_*AnT 7

不,它不是函数指针声明.这只是一种令人费解的方式

top->lo = 0;
top->hi = 0;
++top;
Run Code Online (Sandbox Code Playgroud)

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

top->lo = 0, top->hi = 0, ++top;
Run Code Online (Sandbox Code Playgroud)

然后添加不必要的演员表

top->lo = (void *) 0, top->hi = (void *) 0, ++top;
Run Code Online (Sandbox Code Playgroud)

和一堆冗余()

(top->lo = (((void *) 0))), (top->hi = (((void *) 0))), ++top;
Run Code Online (Sandbox Code Playgroud)

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

((void) ((top->lo = (((void *) 0))), (top->hi = (((void *) 0))), ++top));
Run Code Online (Sandbox Code Playgroud)

现在你有了原始版本.

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