我一直在研究 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/