函数名称与函数指针等价
C 中的函数名称既充当函数指示符又充当函数指针,为引用函数提供了方便的简写。这种等价性一直存在争议,其基本原理在于历史考虑和简化函数指针使用的愿望。
C90 基本原理文档解释了函数指示符可以以多种形式使用,包括作为函数调用(都与并且没有星号运算符)和函数指针。这种灵活性允许各种语法结构,其中一些可能看起来不寻常。
例如,考虑以下声明:
int f(); int (*pf)();
这里,函数名称 f 可以调用为 f( )、*f() 甚至 ***f()。此外,函数指针 pf 可以通过类似的方式调用,例如 pf()、*pf() 或 **pf()。
这种等价的基本原理源于简化使用的愿望函数指针。在许多情况下,直接使用函数名作为函数指针比手动应用取址运算符 (&) 更方便。因此,该语言允许函数名和函数指针的等价。
但是,这种等价仅限于某些上下文。返回函数类型时,函数类型本身不能隐式转换为指向自身的指针。下面的示例对此进行了说明:
typedef bool FunctionType(int); FunctionType h(); // Error!
在这种情况下,h() 被声明为返回函数类型的函数,但这不能隐式转换为指向该函数类型的指针。但是,当用作参数时,函数类型可以隐式转换为指向自身的指针。
FunctionType g(FunctionType); // Implicitly converted to void g(FunctionType *)
这种隐式转换简化了函数指针作为参数的传递。总的来说,函数名和函数指针的等价是一种平衡便利性和上下文限制的设计选择,使其成为 C 编程中的实用功能。
以上是为什么 C 中函数名和函数指针是等效的?的详细内容。更多信息请关注PHP中文网其他相关文章!