gpt4 book ai didi

c - 将用户可定义的类型放入回调原型(prototype)中是个好主意吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:21 25 4
gpt4 key购买 nike

为了提高某些 C 库代码的类型安全性,我想到了在回调函数中使用用户可定义的类型。因此,代码没有使用 void*,而是使用了 Usertype*。该库只声明类型,但不定义类型,并将此类型用作不透明指针。与常规方案不同,库定义了所有使用的类型,回调函数中使用的部分是前向声明的,留给用户定义。

/*library code*/

struct UserDataForFooCallback; /* opaque user datatype */

typedef void CallbackFn(int i, struct UserDataForFooCallback* user);

void foo(CallbackFn* callback, struct UserDataForFooCallback* user)
{
callback(42, user);
}


/*application code*/

#include <stdio.h>
#include "foo.h"

struct UserDataForFooCallback
{
int a;
};

static void fooCallback(int i, struct UserDataForFooCallback* user)
{
printf(user->a == i ? "ok\n" : "fail\n");
}

int main()
{
struct UserDataForFooCallback cbd = {42};
foo(fooCallback, &cbd);
return 0;
}

优点:

  • 类型安全回调
  • 回调代码中没有struct MyFoo* data=arg指针赋值

缺点:

  • 据我所知,用户定义的数据类型的定义不能超过一个(或者我是否将其与 C++ 的一个定义规则混合在一起?),如果回调用函数的使用不止一个,这会使它们成为问题(说例子中的foo被不同的程序部分使用)
  • 需要为每个回调/回调组定义一个新类型(也许这不是那么重要,因为许多回调函数确实已经使用了一个)

我想知道的主要是这是否真的是个好主意,或者这是否只是一个好看但具有世界末日般影响力的想法。

最佳答案

如果有两个库使用您的库,并且都将 UserDataForFooCallback 定义为不同的结构,则违反了一个定义规则。坚持使用 void*

关于c - 将用户可定义的类型放入回调原型(prototype)中是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6958078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com