C - 在另一个函数的参数中用作指针的typedef函数

时间:2015-07-28 06:58:56

标签: c function-pointers typedef

我有一个头文件,定义了如下所示的代码:

typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
typedef void ChangeT(uint64_t post1, uint8_t post2);

struct ClusterT * ClientAlloc(EnrollT *, ChangeT *);

我有以下问题:

  1. 以下代码是否相同?

    typedef uint8_t EnrollT(uint16_t test1, uint16_t test2);
    typedef uint8_t (*EnrollT)(uint16_t test1, uint16_t test2);
    
  2. 在包含此标头的C文件中,如何在ClientAlloc函数中处理这两个参数?示例代码对我来说很棒。

  3. =============================================== =========================

    感谢您的回复。 通过两个实际函数,我将它们传递给以下代码:

    ClientAlloc(Enroll, Change)
    

    然而,当我编译代码时,我得到以下错误,这是我在这里遗漏的任何内容吗?

    expected declaration specifiers or ‘...’ before ‘Enroll’
    expected declaration specifiers or ‘...’ before ‘NotifyChange’
    

2 个答案:

答案 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);