一个接受 void func(void) 和 void func(void* param) 的函数
One function to accept void func(void) and void func(void* param)
我将 C 与 GNU 编译器集合一起使用。
所以我需要将函数指针传递给一个函数。现在我想处理两种类型的可接受的函数指针原型:
void function(void);
和
void function(void* param);
现在我有以下内容:
int createProcess(void (*procFunc)(void*), void* param);
这仅适用于第二个原型。有没有办法让它适用于两个示例原型?
您可以使用具有未指定数量参数的函数指针:
int createProcess(void (*procFunc)(), void* param);
但是你还需要区分这两种功能。添加第三个参数或(如果您的函数尚未使用它)使用 param
的空指针值作为区分这两种函数的标志。
请注意,声明具有未指定数量参数的函数是过时的 C 功能,因此您可以考虑声明两个不同的 createProcess
函数。
创建一个类似这样的类型。
typedef struct fnn {
int fntype;
union {
void (*fn0)(void);
void (*fn1)(void* param);
} fn;
} fnArg;
在 fntype 中输入 0 或 1 以标识您使用了哪些联合字段,填充相关的 fn.fn0 或 fn.fn1 并将此结构作为第一个参数传递。
这基本上是一种更复杂的语言会做的事情,但它会隐藏细节。
编辑:如果您有其他方法来决定使用哪个字段,您也可以只使用联合。
我将 C 与 GNU 编译器集合一起使用。 所以我需要将函数指针传递给一个函数。现在我想处理两种类型的可接受的函数指针原型:
void function(void);
和
void function(void* param);
现在我有以下内容:
int createProcess(void (*procFunc)(void*), void* param);
这仅适用于第二个原型。有没有办法让它适用于两个示例原型?
您可以使用具有未指定数量参数的函数指针:
int createProcess(void (*procFunc)(), void* param);
但是你还需要区分这两种功能。添加第三个参数或(如果您的函数尚未使用它)使用 param
的空指针值作为区分这两种函数的标志。
请注意,声明具有未指定数量参数的函数是过时的 C 功能,因此您可以考虑声明两个不同的 createProcess
函数。
创建一个类似这样的类型。
typedef struct fnn {
int fntype;
union {
void (*fn0)(void);
void (*fn1)(void* param);
} fn;
} fnArg;
在 fntype 中输入 0 或 1 以标识您使用了哪些联合字段,填充相关的 fn.fn0 或 fn.fn1 并将此结构作为第一个参数传递。
这基本上是一种更复杂的语言会做的事情,但它会隐藏细节。
编辑:如果您有其他方法来决定使用哪个字段,您也可以只使用联合。