【发布时间】:2014-04-23 18:29:18
【问题描述】:
在一个普通的 C 程序中,我有某些类型的某些值,这些值可能有也可能没有某个属性,并且该属性必须对某些具有此值的用户保持不变。我想知道我们是否/如何使用类型系统在编译时为那些需要它的被调用函数强制执行此属性。
例如,给定这个结构定义:
struct foo {
bool has_property_bar;
...
}
某些函数采用struct foo * 类型的值,has_property_bar 必须为真,因此它们必须通过在运行时测试相关字段来检查此属性(通常使用断言)。
现在我想知道是否可以通过定义一个基于 foo 的新类型来避免这些运行时测试,这表示该值确实具有所需的属性。可能是这样的:
struct bar_compliant_foo {
struct foo real_foo;
}
struct bar_compliant_foo *set_property_bar(struct foo *f) {
f->has_property_bar = TRUE;
return (struct bar_compliant_foo*)f;
}
int do_something_with_compliant_foo(struct bar_compliant_foo *bf) {
struct foo *f = &bf->real_foo;
...
}
这是否适用于玩具程序?除了使用包装原始类型的结构之外,还有其他/更好的方法吗?
【问题讨论】:
-
我猜你没有任何剩余。将您的 int 升级到更大的尺寸 (int64) 可以让您使用。 OTOH,使用结构体可能会更好,因为除了最简单的数学运算之外,它会对所有操作造成严重破坏。
-
锁定是什么意思?你想创建对象和继承吗?
-
“这是否适用于玩具程序?”这根本不应该起作用,至少在大多数具有抢先调度的现代操作系统中不起作用。 “除了使用包装原始类型的结构之外,还有其他/更好的方法吗?”是的,使用与调度程序实际交互的锁定机制。特别是对于 C,您应该使用系统提供的互斥锁(或信号量)。 “我想知道我们是否/如何使用类型系统来检查这个属性。”我不确定我们是否对该术语有相同的解释,但是不,C 的类型系统无法帮助您解决并发问题。
-
这个问题不是关于以任何方式锁定。它是关于能够断言某个属性适用于我的对象,而无需诉诸运行时检查。使用语言的类型系统是在编译时确保对象具有某些属性的一种方法,这就是我在 C 中尝试做的事情。我将删除对“锁定”的引用,因为它似乎具有误导性。跨度>
-
如何阻止某人拨打
set_property_bar(),将属性更改回FALSE,然后拨打do_something_with_compliant_foo()?如果has_property_bar有时是TRUE,有时是FALSE,显然你不能在编译时检查这个,因为直到程序运行才决定。如果无论调用者想要什么都需要它是真的,那么只需将do_something_with_compliant_foo()的第一行设置为f->has_property_bar = TRUE;或类似的,你就可以保证它会是。
标签: c types struct compile-time