C中的数据抽象

时间:2013-10-06 13:36:15

标签: c oop procedural-programming

我对数据抽象的理解是隐藏用户的技术细节并仅显示必要的细节。因此,数据抽象是一种OOP功能。我的问题是:C是否也支持数据抽象?

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

如果我的问题的答案是 no ,那么C中的结构,枚举怎么样?他们还隐藏了用户的详细信息。

2 个答案:

答案 0 :(得分:5)

在C语言中进行面向对象编程当然是可能的。 first C++ compiler实际上是一个C ++到C的转换器,Python VM是用C语言编写的。将所谓的OOP语言与其他语言区别开来的是对这些结构的更好支持,例如语法。

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

/**
 * 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中的抽象示例。请参阅this article以阅读有关此特定示例的更多信息。

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

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

要了解有关C语言中面向对象编程的更多信息,我推荐免费在线书籍Object Oriented Programming in ANSI-C。查看this Dr Dobbs文章。相关问题:Object orientation in CCan you write object oriented code in C?

答案 1 :(得分:1)

隐藏在C中很容易,只需要强制转换

OOP 可以完成但是我会说某些功能并不是很方便获得(例如:继承)我想多态甚至可能已经实现但从未在家中尝试过!

C 接口到本机C ++库很常见,例如:

void *obj_create(void); /* return obscure ptr */
int obj_method(void *obj, int somearg);
void obj_destroy(void *obj);

将私有标题与公共分布分开,即。

修改

AmigaOS 中有一个C基本的OOP实现,它实现了多年,至少仍在AROS项目中使用,实现称为BOOPSI,也是一些GUI小工具(小部件)的基础,但只能用于描述对象,这里有一个小introduction(在 Amiga Rom内核参考手册中它展示了如何使用它向更多对象广播信号,这是先锋Qt的插槽/信号实现。)

过去几天我一直在调查Nim lang,它生成C代码(添加一些运行时,可能是disabled)来编译后端像gcc / clang / tinycc,它支持一些OOP。