我正在用c开发一个GUI,所以我有很多小部件,基本上是结构,第一个成员是指向基类的指针:
typedef struct mkGuiButton {
struct mkGuiWidget *base;
int some_propperty;
[...]
}mkGuiButton;
我这样做是因为我喜欢此方法提供的编译时的类型安全性,因此像mk_gui_button_set_label(mkGuiButton *, const char *label)
这样的函数可以将mkGuiButton *
类型作为参数而不是mkGuiText *
。< / p>
当函数在所有小部件中常见的一些标志和属性中运行时,这个实现的缺点就出现了,这就是基本结构。
我不想为每个窗口小部件类型创建特定的函数,所以我使这些函数采用void *
这样的mk_gui_set_visible(void *widget, bool state)
指针,然后在这个函数中我将指针转换为{{1很明显我失去了类型安全性。
我可以在编译时没有类型安全,但不能在运行时生存,所以我得到了这个解决方案:基本结构,这是mkGuiWidget *
,有一个特殊的成员mkGuiWidget
(int是32创建时设置为知道值(如2155553647),然后在每个“通用”函数内部进行检查:
int signature
所以问题是:这是一种可靠的方法来进行运行时类型安全检查,还是更好的方法呢?