我有一个头文件,定义了如下所示的代码:
typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
typedef void ChangeT(uint64_t post1, uint8_t post2);
struct ClusterT * ClientAlloc(EnrollT *, ChangeT *);
我有以下问题:
以下代码是否相同?
typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
typedef uint8_t (*EnrollT)(uint16_t test1, uint16_t test2);
在包含此标头的C文件中,如何在ClientAlloc函数中处理这两个参数?示例代码对我来说很棒。
=============================================== =========================
感谢您的回复。 通过两个实际函数,我将它们传递给以下代码:
ClientAlloc(Enroll, Change)
然而,当我编译代码时,我得到以下错误,这是我在这里遗漏的任何内容吗?
expected declaration specifiers or ‘...’ before ‘Enroll’
expected declaration specifiers or ‘...’ before ‘NotifyChange’
答案 0 :(得分:1)
不,他们不是。
typedef uint8_t (*PEnrollT)(uint16_t test1, uint16_t test2);
定义与此签名匹配的函数指针类型。所以,
uint8_t EnrollT(uint16_t test1, uint16_t test2);
与此签名匹配 你可以使用像: PEnrollT pfn = EnrollT; 并用作pfn(....); //等同于调用EnrollT
现在,你有
typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
typedef void ChangeT(uint64_t post1, uint8_t post2);
所以,你有类型EnrollT是"函数有两个uint16_t参数返回uinit8_t。 另外,你有,
struct ClusterT * ClientAlloc(EnrollT *, ChangeT *);
所以,如果你有两个匹配EnrollT,ChangeT的函数,你可以调用ClientAlloc传递这两个函数
答案 1 :(得分:0)
解决第二个问题:
您必须使用EnrollT和ChangeT定义的签名创建两个函数(但您不能按名称使用EnrollT和ChangeT类型):
uint8_t enroll(uint16_t test1, uint16_t test2){ ... };
void change(uint64_t post1, uint8_t post2){ ... };
然后将它们传递给函数调用:
ClientAlloc(enroll, change);