c - 为什么 C 不允许结构中存在成员函数?

标签 c struct

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

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

最佳答案

你正在向后看。

C 的设计并不是从 C++ 开始,然后删除功能。 C 是从更古老的语言开始设计的,包括 B、FORTRAN 和当时的汇编语言。

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

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

现在应该清楚了:C++ 的设计者是如何引入这么多功能的?因为C已经在那里,他们可以从那里开始。为什么 C 语言的设计者不一开始就引入所有这些功能?嗯,因为那些人忙于设计 C 本身。

关键是,每一种成功的语言通常都比以前的语言有所改进。与以前相比,C 提供的一切都使编程变得更安全、更容易。。当然,它并没有具备我们今天拥有的所有功能,但即使回想起来,它也不应该具备 - 语言设计者需要在实践中了解程序员需要什么样的东西上。

关于c - 为什么 C 不允许结构中存在成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808887/

相关文章:

c - x86 gcc 程序集输出帮助请

c - 为什么这个执行无效指针初始化的程序在 C 中编译得很好?

c - 为什么要在 Linux 中关闭管道?

c - 关于三重 for 循环中的一个的小困惑

C fread() 神奇地读取动态分配的结构成员,如何?

c - 将函数数组作为参数传递给函数

file - 在 Go 中将多个结构写入一个文件

c - 将结构传递给函数

C++ 增量运算符

c++ - 推广结构访问的有效且实用的方法?