首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言中的数据抽取

C语言中的数据抽取
EN

Stack Overflow用户
提问于 2013-10-06 13:36:15
回答 2查看 11.1K关注 0票数 7

我对数据抽象的理解是向用户隐藏技术细节,只显示必要的细节。因此,数据抽象是一个面向对象的特性。我的问题是:C也支持数据抽象吗?

如果是这样的话,为什么数据抽象是面向对象的编程语言特性而不是过程语言特性?

如果我的问题答案是否定的,那么C中的结构、枚举又如何呢?他们也向用户隐藏细节。

EN

回答 2

Stack Overflow用户

发布于 2015-07-22 14:35:12

当然可以在C中进行面向对象的编程。记住,例如,第一个C++编译器实际上是一个C++到C转换程序,Python是用C等编写的。将所谓的OOP语言与其他语言区别开来的东西更好地支持这些构造,例如语法。

提供抽象的一种常见方法是函数指针。查看下面Linux内核源代码中的结构(来自include/linux/virtio.h)。

代码语言:javascript
运行
复制
/**
 * virtio_driver - operations for a virtio I/O driver
 * @driver: underlying device driver (populate name and owner).
 * @id_table: the ids serviced by this driver.
 * @feature_table: an array of feature numbers supported by this driver.
 * @feature_table_size: number of entries in the feature table array.
 * @probe: the function to call when a device is found.  Returns 0 or -errno.
 * @remove: the function to call when a device is removed.
 * @config_changed: optional function to call when the device configuration
 *    changes; may be called in interrupt context.
 */
struct virtio_driver {
        struct device_driver driver;
        const struct virtio_device_id *id_table;
        const unsigned int *feature_table;
        unsigned int feature_table_size;
        int (*probe)(struct virtio_device *dev);
        void (*scan)(struct virtio_device *dev);
        void (*remove)(struct virtio_device *dev);
        void (*config_changed)(struct virtio_device *dev);
#ifdef CONFIG_PM
        int (*freeze)(struct virtio_device *dev);
        int (*restore)(struct virtio_device *dev);
#endif
};

probescanremove等都是I/O驱动程序自己设置的函数指针。然后,内核可以为任何I/O驱动程序调用这些函数,而不需要了解任何有关设备的信息。这是C中的一个抽象示例,请参阅这篇文章阅读有关此特定示例的更多信息。

另一种数据抽象形式是不透明指针。不透明数据类型在头文件中声明,但定义从未公开。不知道类型定义的代码永远不能访问它的值,只能使用指向它的指针。请参阅维基百科上的不透明数据类型不透明指针

您可能遇到过的不透明数据类型的一个例子是stdio.h中的FILE。所有操作系统都使用相同的接口,尽管FILE *所指向的实际数据不同。您可以通过调用FILE *并使用一系列其他函数调用来操作fopen,但是您可能看不到它指向的数据。

要想更多地了解C语言中的面向对象编程,我推荐免费的在线书籍面向对象的ANSI-C程序设计。查看这个多布斯博士文章。相关问题:面向对象的C语言你能用C语言编写面向对象的代码吗?

票数 5
EN

Stack Overflow用户

发布于 2013-10-06 14:32:08

在C语言中隐藏很容易,只是一个演员的问题。

OOP是可以做到的,但我要说的是,某些特性并不是很容易获得(例如:继承),我猜多态可能甚至已经实现,但从未在家里尝试过!

本地C++库的C接口很常见,类似于:

代码语言:javascript
运行
复制
void *obj_create(void); /* return obscure ptr */
int obj_method(void *obj, int somearg);
void obj_destroy(void *obj);

将私有标头与公共标头分开,即分发。

编辑

在AmigaOS中,有一个C basic OOP实现,使用时间较长,至少在阿罗斯项目中仍然使用,该实现被称为波普西,也是一些GUI小部件(小部件)的基础,但只用于描述对象,这里有一个小引言 (在AmigaOS内核参考手册中,演示了如何使用它向更多对象广播信号,这是Qt插槽/信号实现的先驱)。

在过去的几天里,我一直在研究尼朗,它生成C代码(添加一些运行时,可能是已禁用)来使用gcc/clang/tinycc这样的后端进行编译,并且它支持一些OOP。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19209455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档