我想知道,当我们创建这个函数
int compar(const void *, const void *)我们只是将它的名称传递给qsort和bsearch的一个参数,这些函数如何识别所述的本质上是随机的单词(因为我们从未明确声明它是一个函数指针,而是一个实际的函数)并使用它作为参数呢?qsort和bsearch的函数声明中是否有显式强制转换?
发布于 2013-10-03 06:34:36
这与qsort和bsearch函数本身无关,而是编译器将函数名隐式转换为标准的C11 6.3.2.1 Language / Conversions / Other operands / Lvalues, arrays, and function designators函数指针。
函数指示符是具有函数类型的表达式。除非是大号运算符、_Alignof运算符或一元&运算符的操作数,否则具有“函数返回类型”类型的函数指示符将转换为具有“指向函数返回类型的指针”类型的表达式。
这意味着,当您将compar传递给qsort() (例如)时,传递的是函数的实际指针,而不是某个“本质上随机的单词”。
隐式处理函数标识符作为其地址的原因在很久以前就已经存在了,但是(整个部分都是我的假设,基于我想要考虑的智能推理,但在某种程度上是不确定的),这很可能是因为函数的价值是没有意义的。对于标识符int i = 5;,它有一个值(5),您还可以使用&i获取它的地址。
然而,对于函数来说,它们实际上并没有这样的值。您可以调用它们来生成一个值xyzzy(),并且您可以获得它们的地址&xyzzy,以便稍后通过函数指针进行调用。
但是,它们没有真正的内禀值,与其地址分离,就像整数i所做的那样。所以早期的编译器(ANSI前)只允许简写的xyzzy表示&xyzzy.当然,由于ANSI最初的任务是编纂现有的实践,而不是创造一种新的语言,所以他们保留了这种行为。
如果K&R走了另一条路,并决定xyzzy应该是对不传递参数的函数的调用,与xyzzy()一样,世界将是一个不同的地方:-)
https://stackoverflow.com/questions/19152146
复制相似问题