我有一段代码,它是函数指针的一个例子,取自Linux内核源代码.Below是具有回调函数作为其成员的结构
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_driver_chain;
其中attach_driver_chain是函数但我在驱动程序代码中找不到任何这样的初始化。
答案 0 :(得分:7)
后缀()
运算符(函数调用)被定义为获取指向函数的指针并调用该函数。所以它是指针的显式解除引用。没有其他方法可以调用函数。
虽然(*FunctionPointer)()
看起来像是一个显式的解除引用,但表达式*FunctionPointer
的类型是一个函数。根据C 2011 6.3.2.1 4,函数类型的表达式被转换为指向函数的指针(表达式是sizeof
,_Alignof
或&
的操作数时除外)。因此,在(*FunctionPointer)()
中,*FunctionPointer
被转换为与FunctionPointer
相同,并且没有完成任何操作:表达式与之前相同,()
运算符作用于函数指针,而不是函数。
使用FunctionPointer()
调用函数并使用(*FunctionPointer)()
调用函数没有区别。你甚至可以用相同的效果写(***************FunctionPointer)()
。每个*
运算符都将被自动转换无效。
答案 1 :(得分:4)
上面的函数是以隐式方式调用的,但想知道它是如何被称为显式方式。
像这样:
(*(drv->attach))(port); // Not very pretty, huh?
解除引用函数指针的隐式和显式方式有什么区别
没有区别:因为你可以用函数指针做的就是调用它所指向的函数,编译器会忽略函数指针的显式解引用。
答案 2 :(得分:-1)
此示例也可能有所帮助
std::set<int> tmpSet;
tmpSet.insert(col);
result = sparseBlue.insert(std::make_pair(row, tmpSet));