gpt4 book ai didi

c - C 中的绑定(bind)变量?

转载 作者:行者123 更新时间:2023-12-04 10:46:00 26 4
gpt4 key购买 nike

我正在用 C 编写一个高度异步的项目。不幸的是,很快就会发现有很多样板文件以指定包含用于回调的用户数据的结构的形式存在。

例如:

typedef struct SomeUserData {
int foo;
int bar;
} SomeUserData;

void someCallback(void * userData)
{
SomeUserData * myData = userData;
// ...
free(myData);
}

void someFunc(void)
{
SomeUserData * myData = calloc(1, sizeof(*myData));
myData->foo = 5;
myData->bar = 10;
doSomeAsync(someCallback, myData);
}

当只有一两个回调时并没有那么糟糕,但是由于涉及的异步步骤的数量,我正在处理的项目部分现在有数百个。

我想要的是类似于 C++ 中的 bind 的东西。有没有一种方法可以通过某些 C 宏技巧甚至在运行时使用可变参数来实现类似的结果?

最佳答案

C 宏技巧并不总是最容易调试的,但是:

#include <stdlib.h>

typedef struct Type1 {
int foo ;
} Type1 ;
typedef struct Type2 {
char* bar ;
} Type2 ;

#define CALLBACK( Type ) \
void my##Type##Callback( Type* myData ) ; \
void Type##Callback( void* userData ) \
{ \
my##Type##Callback( (Type*) userData ) ; \
free( userData ) ; \
} \
void my##Type##Callback( Type* myData )

CALLBACK( Type1 )
{
printf( "Type1=%d\n", myData->foo ) ;
}

CALLBACK( Type2 )
{
printf( "Type2=%s\n", myData->bar ) ;
}

void doAsync( void (*callback)( void* ), void* data )
{
(*callback)( data ) ;
}

int main()
{
Type1* t1 = calloc( 1, sizeof(*t1) ) ;
Type2* t2 = calloc( 1, sizeof(*t2) ) ;
t1->foo = 42 ;
t2->bar = "TheAnswer" ;
doAsync( myType1Callback, t1 ) ;
doAsync( myType2Callback, t2 ) ;
}

可能会有帮助。它声明一个“myXXXCallback”接受一个指向指定类型的指针,然后创建一个“XXXCallback”接受一个调用特定类型版本的 void*,然后释放数据。 “技巧”是使用“##”运算符将传入的类型连接到函数名称中。

关于c - C 中的绑定(bind)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20810493/

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