为什么C允许结构中的成员函数?

时间:2016-01-15 10:21:35

标签: c struct

C和C ++之间的一个重大区别是结构中的成员函数。 C不允许函数作为结构中的成员。我知道一个解决方法是使用函数指针作为结构成员,但这只是函数模拟,它打破了范围规则。

如果C允许实际函数作为结构的成员,那将是一个很好的功能。但我不知道为什么C不这样做。有什么特别的原因吗?

4 个答案:

答案 0 :(得分:9)

你向后看它。

C不是从C ++开始然后删除功能而设计的。 C是从较旧的语言开始设计的,包括B,FORTRAN和当时的汇编语言。

从那里开始,C的设计者添加了代表当代代码中经常出现的模式的功能,例如数据类型(而不是使用位),用户定义的复合类型(结构),干净分离的函数(而不是指令流和跳转到那里),传递参数(而不是通过寄存器和堆栈手动传递它们,相应地检索它们,然后手动清理),等等。

从那里开始,现在OOP语言的设计者添加了代表经常出现在当代代码中的模式的功能,例如与他们操作的数据(方法),数据类型齐头并进的功能继承(而不仅仅是组合),可见性控制和封装(而不是隐藏在不透明指针之后),调用点处的多态(而不是显式检查表示数据类型的内部标志),等等。

现在应该很清楚:C ++的设计者是如何引入这么多功能的呢?因为C已经存在,他们可以从那里开始。为什么C的设计师不介绍所有这些功能?好吧,因为那些人太忙于设计C本身。

关键是,每一个成功的语言通常都是的改进。 C提供的所有内容都使编程更安全,更容易,与之前相比。当然,它并没有我们今天拥有的所有功能,但即使回想起来,也不应该 - 语言设计师需要在实践中看到 需要什么样的东西来自那里的程序员。

答案 1 :(得分:6)

因为C不是C ++。它们是不同的语言。

答案 2 :(得分:0)

将数据与其功能混合通常仅在面向对象编程(OOP)中进行。

由于C不是设计为OOP(它是一种过程语言,大多数OOP语言是在历史后期开发的),因此将数据与函数混合是没有意义的。

答案 3 :(得分:0)

C是面向过程的语言,C ++是面向对象的语言。 面向对象的语言模拟作为现实世界的对象的一切。 类是对象的类型,它可以具有属性和方法(函数)。 如果你想让make struct在其中有函数,那么它将是另一种编程语言。 请不要将面向过程的语言与面向对象的语言混合使用。