繁体   English   中英

C function 具有可变参数化和类型的指针

[英]C function pointers with variable parameterisation and type

我正在开发一个用 C 编写的游戏引擎,试图尽可能少地使用标准库。 对于我在游戏中的“对象”,我有我的“抽象”结构版本,让人想起面向 object 的语言,如 Java 和 C#,但当我做事时,它们会出现问题一组功能。 有没有一种方法可以存储(作为结构的成员)一个具有可变大小、类型和参数化的 function 指针数组? 我是否可以只放弃其中一项要求,即具备 void 类型的所有操作功能? 或者我应该完全回到绘图板上吗? 我假设这也必须动态分配,但据我所知,这是这类事情的标准,对吧? 提前致谢

您可以安全地将任何 function 指针转换为任何其他 function 指针类型,只要在调用它之前将其转换回正确的类型 (C17 6.3.2.3.8)。 因此,例如,您可以将一个void (*)(void)指针数组作为函数表。 您可以像任何其他数组一样动态分配它。 请注意,指向此类数组的指针将具有“指向函数指针的指针”类型。

许多人发现使用 typedef 有助于使 C 的 function 指针语法不那么混乱。

typedef void (*funcptr_v_v)(void);
typedef double (*funcptr_d_ii)(int, int);
typedef char *(*funcptr_cp_i)(int);

struct foo {
    funcptr_v_v *table;
};

double my_d_ii(int x, int y) { ... }
char *my_cp_i(int z) { ... }

struct foo f;
f.table = malloc(10 * sizeof(funcptr_v_v));
f.table[0] = (funcptr_v_v)my_d_ii;
f.table[1] = (funcptr_v_v)my_cp_i;
// ...
printf("Calling my_cp_i(7), returning %s\n", ((funcptr_cp_i)(f.table[1]))(7));

如果你想定义没有 typedef 的struct foo它看起来像

struct foo {
    void (**table)(void);
};

当然,您可以以某种方式跟踪存储在f.table[1]中的 function 指针实际上指向一个 function 的事实,该 function 采用一个int参数并返回char * ,并在调用它时正确地转换回. 无法在运行时测试类型。 如果你应该将它转换为与它指向的 function 不匹配的类型,并以这种方式调用它,编译器可能不会阻止你,但事情可能会在运行时严重中断。 因此,您需要以一种难以出错的方式设计代码。

“性能可行”并不是真正可以回答的; 在您进行测试之前,无法知道您的性能需求或瓶颈是什么。 但是创建和释放这样的数组并不比任何其他类型的动态数组更昂贵或更便宜,并且通过指针调用 function 通常只比直接调用慢一点,如果有的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM