1

我有一段代码,它是函数指针的示例,取自 Linux 内核源代码。下面是具有回调函数作为其成员的结构

 struct parport_driver {
 const char *name;
 void (*attach) (struct parport *);
 struct parport_driver *next;
 };

现在这些结构的成员在 C 文件中被调用,如下所示

 struct parport_driver *drv;

 drv->attach(port); /* calling function through implicit dereference */

上面的函数是以隐式方式调用的,但我想知道它如何被称为显式方式。

取消引用函数指针的隐式和显式方式有什么区别。

我想知道的另一件事是结构成员附加应该在调用之前初始化 (drv->attach(port));

有点像

drv->attach=attach_driver_chain;

其中 attach_driver_chain 是函数,但我在驱动程序代码中找不到任何此类初始化。

4

3 回答 3

7

后缀()运算符(函数调用)被定义为获取指向函数的指针并调用该函数。所以它是指针的显式取消引用。没有其他方法可以调用函数。

尽管(*FunctionPointer)()看起来像显式取消引用,但表达式的类型*FunctionPointer是函数。根据 C 2011 6.3.2.1 4,函数类型的表达式将转换为指向函数的指针(表达式是 、 或 的操作数时sizeof除外_Alignof&。因此, in (*FunctionPointer)(),*FunctionPointer被转换为与 相同FunctionPointer,但什么也没有完成:表达式与以前相同,()运算符作用于函数指针,而不是函数。

FunctionPointer()用 调用函数和用 调用函数没有区别(*FunctionPointer)()。你甚至可以写出(***************FunctionPointer)()同样的效果。自动转换将使每个*运算符无效。

于 2013-06-26T13:25:19.583 回答
4

上面的函数以隐式方式调用,但想知道如何以显式方式调用它。

像这样:

(*(drv->attach))(port); // Not very pretty, huh?

取消引用函数指针的隐式和显式方式有什么区别

没有区别:因为你可以对函数指针做的就是调用它指向的函数,编译器会忽略函数指针的显式取消引用。

于 2013-06-26T10:40:06.530 回答
-1

这个例子也可能有帮助

struct product
{
    string name;
    int weight;
    double price;
};

product *p1 = new product();
(*p1).name = "orange"; // This is an explicit dereferencing
p1->name = "orange";   // This is also an explicit dereferencing

product *p2 = &p1;
p2.name = "apple"; // This is an implicit dereferencing
于 2016-01-05T19:49:36.063 回答