Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C语言中的数据抽取

C语言中的数据抽取
EN

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

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

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

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

EN

回答 2

Stack Overflow用户

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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 06:32:08

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
如何编写自己的jQuery插件?
对于那些不知道的人来说,jQuery是一个JavaScript库,它包含了许多特性,非常小而且速度很快。它还包括一个易于使用的API,在所有浏览器上都是兼容的,并且可以很容易的进行HTML遍历、动画、DOM操作和事件处理。它不仅可扩展,而且经久耐用。因此,客户端脚本自开发以来变得容易得多。
liuxuewen
2018/09/12
1.7K0
基础 | 详细图解jQuery对象,以及如何扩展jQuery插件
作者|波同学 原文|http://www.jianshu.com/p/3f97570d22b4 早几年学习前端,大家都非常热衷于研究jQuery源码。我还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,“原来JavaScript居然可以这样用!” 虽然随着前端的发展,另外几种前端框架的崛起,jQuery慢慢变得不再是必须。因此大家对于jQuery的热情低了很多。但是许多从jQuery中学到的技巧用在实际开发中仍然非常好用。简单的了解它也有助于我们更加深入的理解JavaScri
用户1097444
2022/06/29
6810
基础 | 详细图解jQuery对象,以及如何扩展jQuery插件
jQuery 插件
​ jQuery 功能比较有限,想要更复杂的特效效果,可以借助于 jQuery 插件完成。 这些插件也是依赖于jQuery来完成的,所以必须要先引入
梨涡浅笑
2022/05/08
7.1K0
jQuery 插件
【JQuery】JQuery入门——JQuery 插件-validation
validate 是 jQuery 插件,及必须在 jQuery 的基础上进行运行。我们将导入 jQuery 库、 validate
陶然同学
2023/02/27
12.4K0
【JQuery】JQuery入门——JQuery 插件-validation
jQuery 插件
jQuery 功能比较有限,想要更复杂的特效效果,可以借助于 jQuery 插件完成。 这些插件也是依赖于jQuery来完成的,所以必须要先引入
清出于兰
2020/10/26
6.9K0
jQuery 插件
jQuery——插件
        简单来说:“jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)于2006年1月由John Resig发布。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互
用户10196776
2022/11/22
14.9K0
jQuery 插件
jQuery 功能比较有限,想要更复杂的特效效果,可以借助于 jQuery 插件完成。
星辰_大海
2020/10/09
6.7K0
jQuery 插件
JQuery插件
1.页面 @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <ul id="ul"> <li>第一行</li> <li>第二行</li> <li>第三行</li> <li>第四行</li> <li>第五行</li> <li>第六行</li> </ul> <ul id="ul2"> <li>第一行</li> <li>第二行</li>
用户1055830
2018/01/18
4K0
如何编写一个 jQuery 插件
https://github.com/zcfan/sket... 重写了本文的初步功能实现,支持一个页面多个画图板。但为简单起见,本文保持不变。
Alan Zhang
2018/10/19
7310
如何编写一个 jQuery 插件
如何编写一个jQuery插件
看来 jQuery 你已经用得很爽了,想学习如何自己编写插件。非常好,这篇文档正适合你。用插件和方法来扩展 jQuery 非常强大,把最聪明的功能封装到插件中可以为你及团队节省大量开发时间。
飞奔去旅行
2019/06/13
8090
jQuery插件 -- Form表单插件jquery.form.js
jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地、无侵入地升级HTML表单以支持Ajax。jQuery Form有两个核心方法 -- ajaxForm() 和 ajaxSubmit(), 它们集合了从控制表单元素到决定如何管理提交进程的功能。另外,插件还包括其他的一些方法: formToArray()、formSerialize()、fieldSerialize()、fieldValue()、clearForm()、clearFields() 和 resetForm()等。 下载地址:
joshua317
2018/04/10
13.5K0
jQuery基础--插件
官方API:http://api.jqueryui.com/category/all/
eadela
2019/09/29
3.4K0
jQuery Cookie 插件
Query 可以通过 jquery.cookie.js 插件来操作 Cookie。
陈不成i
2021/07/22
6K0
jQuery插件jQueryUI
jQuery UI是一个功能丰富的jQuery插件集合,提供了一系列用户界面组件和效果,可用于创建交互性强、视觉效果丰富的网页应用程序。
堕落飞鸟
2023/05/18
2.6K0
jQuery常用插件
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
3.2K0
jquery ajaxform插件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src="../../scripts/jquery.js" type="text/javascript"></script> <script src="lib/jquery.form.js" type="text/javascript"></script> <script type="text/javascript"> // json
用户5760343
2019/10/10
8.3K0
jquery ajaxform插件
jQuery插件jQueryValidate
jQuery Validate是一个流行的jQuery表单验证插件,用于验证用户输入的表单数据。它提供了一组简单且强大的验证规则和选项,使开发人员能够轻松地实现客户端表单验证功能。
堕落飞鸟
2023/05/18
2.3K0
eclipse如何安装插件
eclipse安装插件以springsource-tool-suite为例 打开eclipse,找到help/About Eclipse/ 然后点击右下角图标 找到EclipsePlatform对应的
windseek
2018/06/14
1.1K0
Sublime3 安装 jQuery自动补全插件 SublimeCodeIntel
之前为了JavaScript可以自动补全,安装了SublimeCodeIntel插件,将其中jQuery的补全部分改为了JavaScript。 那么,后续为了方便编写jQuery,可以改回来。
Devops海洋的渔夫
2019/05/30
9020
Discourse 如何安装插件
你的 Discourse 需要这个插件吗?实际上是不需要的,这个插件能够帮助你加快索引,但是对 SEO 并不起太大作用。
HoneyMoose
2020/10/30
6230
Discourse 如何安装插件

相似问题

汤姆猫。在Eclipse中工作,但在部署时不工作

12

java applet在部署时不会运行,但在eclipse中运行时可以工作

10

classLoader.getResource()在Eclipse中工作,但在部署时返回null

15

maven测试失败,但在eclipse中工作。

22

dlopen在eclipse中失败,但在ddd上工作。

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文