好吧,我认为标题是足够的描述性(但令人困惑,对不起)。
我在阅读这个图书馆:Timer1。
在头文件中有一个指向函数的公共成员指针,如下所示:
class TimerOne
{
public:
void (*isrCallback)(); // C-style ptr to `void(void)` function
};
存在TimerOne类的示例化对象,称为“Timer 1”。
Timer 1调用函数如下:
Timer1.isrCallback();
这怎么是正确的呢?我熟悉通过函数指针使用解引用操作符调用函数。
例如:
(*myFunc)();
因此,我希望上面通过对象调用的内容更像是:
(*Timer1.isrCallback)();
那么,通过函数指针调用函数的可接受选项是什么,作为对象的独立函数指针 * 和 * 成员?
参见:
1.[非常有用!] Typedef function pointer?
答案总结:
这些都是调用函数指针的有效和良好的方法:
myFuncPtr();
(*myFuncPtr)();
(**myFuncPtr)();
(***myFuncPtr)();
// etc.
(**********************************f)(); // also valid
3条答案
按热度按时间yhxst69z1#
你可以用函数指针做的事情。
1:第一种是通过显式解引用调用函数:
2:第二种方式是通过隐式解引用:
正如您所看到的,隐式解引用方法看起来就像一个普通的函数调用--这正是您所期望的,因为函数可以简单地隐式转换为函数指针!!
在您的代码中:
qyswt5oh2#
你不需要取消引用一个函数指针来调用它。根据标准([ www.example.com ]/1),
后缀表达式应具有函数类型或指向函数类型的指针。
所以
(*myFunc)()
是有效的,myFunc()
也是。事实上,(**myFunc)()
也是有效的,你可以任意多次解引用(你能找出原因吗?)dohp0rv53#
你问:
Timer1
调用函数如下:这怎么是正确的呢?
Timer1.isrCallback
的类型是void (*)()
。它是一个指向函数的指针。这就是为什么你可以使用这种语法。它类似于使用:
您还可以用途:
但第一种形式同样有效。
根据执行处的意见更新
给定您要使用的类的发布定义:
使用
isrCallback
必须定义为非成员变量,其类型是指向TimerOne
成员变量的指针。示例:
输出:
(Test this code)
如果要将
isrCallbak
定义为TimerOne
的成员变量,则需要用途:输出:
(Test this code)