我有两个函数,每个函数都有一个指向不同类型的指针:
void processA(A *); void processB(B *);是否有一个函数指针类型,能够保存指向任一函数的指针而不进行转换? 我试着用
typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB};但它没有用(编译器抱怨指针初始化不兼容)。
编辑:代码的另一部分将遍历Ps的条目,而不知道类型。 此代码将传递char *作为参数。 喜欢这个:
Ps[i](data_pointers[j]);编辑:谢谢大家。 最后,我可能会使用这样的东西:
void processA(void*); void processB(void*); typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB}; ... void processA(void *arg) { A *data = arg; ... }I have two functions, each taking a pointer to a different type:
void processA(A *); void processB(B *);Is there a function pointer type that would be able to hold a pointer to either function without casting? I tried to use
typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB};but it didn't work (compiler complains about incompatible pointer initialization).
Edit: Another part of code would iterate through the entries of Ps, without knowing the types. This code would be passing a char* as a parameter. Like this:
Ps[i](data_pointers[j]);Edit: Thanks everyone. In the end, I will probably use something like this:
void processA(void*); void processB(void*); typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB}; ... void processA(void *arg) { A *data = arg; ... }最满意答案
这可以通过使用联合而不使用强制转换来完成:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef union { void (*A)(A *); void (*B)(B *); } U; U Ps[] = { {.A = processA}, {.B = processB} }; int main(void) { Ps[0].A(0); // 0 used for example; normally you would supply a pointer to an A. Ps[1].B(0); // 0 used for example; normally you would supply a pointer to a B. return 0; }您必须使用正确的成员名称调用该函数; 此方法仅允许您在每个数组元素中存储一个指针或另一个指针,而不是执行奇怪的函数别名。
另一个替代方法是使用代理函数,这些代理函数在使用参数调用时需要具有所需的类型,该参数是指向char的指针并且使用其正确的类型调用实际函数:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef void (*processor_t)(); void processAproxy(char *A) { processA(A); } void processBproxy(char *B) { processB(B); } processor_t Ps[] = { processAproxy, processBproxy }; int main(void) { char *a = (char *) address of some A object; char *b = (char *) address of some B object; Ps[0](a); Ps[1](b); return 0; }我之前使用过char * ,因为你说你正在使用它,但我通常更喜欢void * 。
This can be done without casts by using a union:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef union { void (*A)(A *); void (*B)(B *); } U; U Ps[] = { {.A = processA}, {.B = processB} }; int main(void) { Ps[0].A(0); // 0 used for example; normally you would supply a pointer to an A. Ps[1].B(0); // 0 used for example; normally you would supply a pointer to a B. return 0; }You must call the function using the correct member name; this method only allows you to store one pointer or the other in each array element, not to perform weird function aliasing.
Another alternative is to use proxy functions that do have the type needed when calling with a parameter that is a pointer to char and that call the actual function with its proper type:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef void (*processor_t)(); void processAproxy(char *A) { processA(A); } void processBproxy(char *B) { processB(B); } processor_t Ps[] = { processAproxy, processBproxy }; int main(void) { char *a = (char *) address of some A object; char *b = (char *) address of some B object; Ps[0](a); Ps[1](b); return 0; }I used char * above since you stated you are using it, but I would generally prefer void *.
函数原型与void *参数(function prototype with void* parameter)我有两个函数,每个函数都有一个指向不同类型的指针:
void processA(A *); void processB(B *);是否有一个函数指针类型,能够保存指向任一函数的指针而不进行转换? 我试着用
typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB};但它没有用(编译器抱怨指针初始化不兼容)。
编辑:代码的另一部分将遍历Ps的条目,而不知道类型。 此代码将传递char *作为参数。 喜欢这个:
Ps[i](data_pointers[j]);编辑:谢谢大家。 最后,我可能会使用这样的东西:
void processA(void*); void processB(void*); typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB}; ... void processA(void *arg) { A *data = arg; ... }I have two functions, each taking a pointer to a different type:
void processA(A *); void processB(B *);Is there a function pointer type that would be able to hold a pointer to either function without casting? I tried to use
typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB};but it didn't work (compiler complains about incompatible pointer initialization).
Edit: Another part of code would iterate through the entries of Ps, without knowing the types. This code would be passing a char* as a parameter. Like this:
Ps[i](data_pointers[j]);Edit: Thanks everyone. In the end, I will probably use something like this:
void processA(void*); void processB(void*); typedef void(*processor_t)(void*); processor_t Ps[] = {processA, processB}; ... void processA(void *arg) { A *data = arg; ... }最满意答案
这可以通过使用联合而不使用强制转换来完成:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef union { void (*A)(A *); void (*B)(B *); } U; U Ps[] = { {.A = processA}, {.B = processB} }; int main(void) { Ps[0].A(0); // 0 used for example; normally you would supply a pointer to an A. Ps[1].B(0); // 0 used for example; normally you would supply a pointer to a B. return 0; }您必须使用正确的成员名称调用该函数; 此方法仅允许您在每个数组元素中存储一个指针或另一个指针,而不是执行奇怪的函数别名。
另一个替代方法是使用代理函数,这些代理函数在使用参数调用时需要具有所需的类型,该参数是指向char的指针并且使用其正确的类型调用实际函数:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef void (*processor_t)(); void processAproxy(char *A) { processA(A); } void processBproxy(char *B) { processB(B); } processor_t Ps[] = { processAproxy, processBproxy }; int main(void) { char *a = (char *) address of some A object; char *b = (char *) address of some B object; Ps[0](a); Ps[1](b); return 0; }我之前使用过char * ,因为你说你正在使用它,但我通常更喜欢void * 。
This can be done without casts by using a union:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef union { void (*A)(A *); void (*B)(B *); } U; U Ps[] = { {.A = processA}, {.B = processB} }; int main(void) { Ps[0].A(0); // 0 used for example; normally you would supply a pointer to an A. Ps[1].B(0); // 0 used for example; normally you would supply a pointer to a B. return 0; }You must call the function using the correct member name; this method only allows you to store one pointer or the other in each array element, not to perform weird function aliasing.
Another alternative is to use proxy functions that do have the type needed when calling with a parameter that is a pointer to char and that call the actual function with its proper type:
typedef struct A A; typedef struct B B; void processA(A *); void processB(B *); typedef void (*processor_t)(); void processAproxy(char *A) { processA(A); } void processBproxy(char *B) { processB(B); } processor_t Ps[] = { processAproxy, processBproxy }; int main(void) { char *a = (char *) address of some A object; char *b = (char *) address of some B object; Ps[0](a); Ps[1](b); return 0; }I used char * above since you stated you are using it, but I would generally prefer void *.
发布评论