如何在C中对值的属性进行编码?

如何在C中对值的属性进行编码?,c,types,struct,compile-time,C,Types,Struct,Compile Time,在一个普通的C程序中,我有一些类型的特定值,这些值可能有某个属性,也可能没有某个属性,这个属性对于这个值的某些用户来说必须保持。我想知道我们是否/如何使用类型系统在编译时为那些需要它的被调用函数强制这个属性 例如,给定此结构定义: struct foo { bool has_property_bar; ... } 有些函数采用类型为struct foo*的值,而具有\u属性\u bar必须为true,因此它们必须在运行时通过测试相关字段来检查此属性(通常使用assert) 现在

在一个普通的C程序中,我有一些类型的特定值,这些值可能有某个属性,也可能没有某个属性,这个属性对于这个值的某些用户来说必须保持。我想知道我们是否/如何使用类型系统在编译时为那些需要它的被调用函数强制这个属性

例如,给定此结构定义:

struct foo {
    bool has_property_bar;
    ...
}
有些函数采用类型为
struct foo*
的值,而
具有\u属性\u bar
必须为true,因此它们必须在运行时通过测试相关字段来检查此属性(通常使用assert)

现在,我想知道是否有可能通过定义一个基于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;
    ...
}

除了玩具程序外,这还能用吗?除了使用封装原始类型的结构之外,还有其他更好的方法吗?

C与高级编程语言一样简单,接近于硅。C类型系统反映了这一思想:数据类型只是一堆字节,您可以同时更改它们。也就是说,double是一个由8个字节组成的数组,您可以同时更改它以表示浮点数。这就是C型系统的发展方向


如果您想在编译时强制执行某些程序属性,即布尔变量为True,则必须转移到另一种编程语言。你可以尝试C++与一些巫毒幻像模板元编程。但是从你问的问题类型来看,我想你已经有了一些关于强静态类型编程语言的背景。

我想你已经没有任何知识了。将int升级到更大的大小(int64)可以让您使用位。OTOH,你最好使用一个struct,因为除了最简单的数学运算外,它会破坏所有的运算。你说的锁定是什么意思?你想创建对象和继承吗?“这比玩具程序更管用吗?”这根本不应该管用,至少在大多数具有先发制人调度的现代操作系统中是不行的。“除了使用包装原始类型的结构,还有其他/更好的方法吗?”是的,使用实际与调度程序交互的锁定机制。具体来说,对于C,您应该使用系统提供的互斥量(或信号量)。“我想知道是否/如何使用类型系统来检查此属性。”我不确定我们对该术语是否有相同的解释,但不知道,C的类型系统无法帮助您解决并发性问题。这个问题与以任何方式锁定无关。它是关于能够断言某个属性对我的对象有效,而无需求助于运行时检查。使用该语言的类型系统是确保在编译时对象具有某些属性的一种方法,这就是我在C中尝试做的。我将删除对“锁定”的引用,因为它似乎有误导性。如何阻止有人调用
set\u property\u bar()
,将属性改回
FALSE
,然后调用
do\u something\u和\u-compliant\u-foo()
?如果
具有\u属性\u条
有时为
,有时为
,显然您无法在编译时检查这一点,因为直到程序运行时才确定它。如果不管调用者想要什么,它都需要为true,那么只需将第一行
do\u something\u与\u compliant\u foo()
be
f->has\u property\u bar=true
或类似的,您已经保证会这样。在这种情况下,我无法选择将大量现有代码库切换到另一种语言,因此我尝试使用C。顺便说一句,现在C编译器在混合指向不同结构类型的指针时会抱怨,这已经达到了一定的严格程度,所以我想知道,聪明的人是否设法从语言中挤出了我在这里寻找的功能。