我想知道,当我们创建函数
时int compar(const void *, const void *)
我们只是将其名称传递给qsort
和bsearch
的一个参数,这些函数如何识别基本上随机的单词(因为我们从未明确声明它是一个函数指针,而是一个实际的功能)并将其用作参数?在qsort
和bsearch
的函数声明中是否存在显式强制转换?
答案 0 :(得分:3)
这与qsort
和bsearch
函数本身无关,而是函数名由编译器按照标准C11 6.3.2.1 Language / Conversions / Other operands / Lvalues, arrays, and function designators
隐式转换为函数指针:{/ p >
函数指示符是具有函数类型的表达式。除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数。运算符,类型为“函数返回类型”的函数指示符将转换为具有“指向函数返回类型的指针”类型的表达式。
这意味着,当你将compar
传递给qsort()
时(例如),它是传递给函数的实际指针,而不是一些“基本上随机的单词”。
隐含地将函数标识符作为其地址处理的原因在很久以前就已存在但是(并且这整个部分是我自己的假设,基于我想要考虑的智能推理,但绝不是确定的)这可能是因为函数的值没有意义。使用标识符int i = 5;
, 一个值(5),您还可以使用&i
获取其地址。
但是,对于函数,它们实际上没有这样的值。您可以将它们称为生成值xyzzy()
,然后您可以获取其地址&xyzzy
,以便稍后通过函数指针进行调用。
但他们没有像整数i
那样与其地址分开的真正的内在值。所以早期的编译器(ANSI之前)只允许简写xyzzy
表示&xyzzy
。当然,由于ANSI的最初授权是编纂现有的实践而不是创造一种新的语言,因此他们保留了这种行为。
如果K& R走了另一条路,并决定xyzzy
应该调用函数不传递任何参数,与xyzzy()
相同,那么世界将是另一个地方: - )< / p>