人们已将此帖子标记为this的重复,但这实际上并不是因为我不是在问什么是复合类型,而是它的目的是什么,并且我给出了一个可能导致使用的用例对软件开发人员有害,然后询问这是否应该是未定义的行为。
我正在阅读C11标准中有关复合类型的那一部分,就像:为什么到底有人会这样做吗?
我的意思是我看不到任何有趣的东西。我认为这对程序员来说非常令人困惑。举个例子,假设我们有一个函数TypeofAnyOne
,人们在软件中到处使用,他们只是声明TypeofOne
并使用它。程序员不关心函数的定义。然后有一天,一个聪明的家伙需要在该函数中添加参数,并将其定义更改为interface Relation {
field: string;
class: TypeofAnyOne; // okay now
}
。该软件仍然可以愉快地进行编译,但是,上帝,所有使用旧界面的旧代码都被段错误搞砸了。
下面的代码是一个演示:
Relation
我不明白这种事情的目的。在我看来,这应该是未定义的行为,或者至少是为什么为什么像GCC这样的编译器什么也没说呢?
答案 0 :(得分:3)
您的示例中的要点是函数f()
没有原型,而另一个有原型。没有声明的形式来自早期的C语言,多年来已被标记为过时。
当将原型引入C来适应旧代码和新代码之间时,两者之间的复合类型构造很有帮助。
使用与预期参数不对应的参数调用函数具有未定义的行为,因此,使用这种机制您,您必须知道自己在做什么。
简而言之,不要使用没有原型的声明。它们早已过时,并且可能随时从C标准中删除。