【问题标题】:Can C use object API?C可以使用对象API吗?
【发布时间】:2011-04-03 09:24:27
【问题描述】:

我对 OOP 知之甚少,所以也许我的问题很愚蠢,但仍然......

您能否从过程(非 OO)语言访问面向对象 (OO) API?例如,Win32 API 不是 OO,但我知道 C++ 有一个包装器可以使它成为 OO。但是有没有可能双管齐下呢?

我问是因为我不喜欢 OO 语言;我通过编程微控制器学习了 C,而 OO 语言只是将实际代码从你手中拿走,我担心 OOP 如此流行以至于很快一切都会基于对象。

【问题讨论】:

  • 你的意思是面向对象吗?
  • 如果您问是否可以在 C 中使用 c++ 代码,该问题已在此处得到解答:stackoverflow.com/questions/199418/using-c-library-in-c-code
  • 别担心,用于库的 C api 如此广泛,并被许多不同的语言使用,即使 C 死了它也能存活下来(而且 C 在其领域做得很好,所以我怀疑它会死)。
  • 这里的问题是什么?什么是 OO API?您是在谈论 C++ API 吗?你真的没有道理。也许您应该尝试更具体:命名并提供用例。
  • 有人可以编辑它以消除所有被划掉的单词吗?它们使阅读变得困难。

标签: c oop


【解决方案1】:

让我作为一个从 70 年代到另一个脾气暴躁的老程序员来处理这个问题(?)

在过去我们编写库时,一种常见的技术是使用“init”调用来创建某种“cookie”(通常是指针或数组索引)。然后我们会强制客户端在每次调用库时将 cookie 提供给我们。这使我们能够做任何需要我们的图书馆登记的事情(以可重入的方式),而不会用所有的实现细节来烦扰客户。作为一名 C 程序员,您应该非常熟悉这种风格,因为 C 将它用于所有文件 I/O,就像 Unix 一样。微软喜欢称它们为“句柄”而不是“cookies”。 Unix 称它们为“文件”,有时也称它们为“文件句柄”。

OO 语言所做的大部分工作就是围绕这种技术添加一些额外的语法。现在,您所有的电话都不是以LibnameCallname (cookie, ... 开头,而是以cookie.callname(... 开头。但实际上,在很多方面,这只是为了让我们的程序员更轻松的语法更改(让我们无需在所有内容上输入额外的不需要的 Libname)。

现在从某种意义上说,操作系统(包括 Unix,它使用文件作为其基本范式来实现几乎所有东西),已经是面向对象的,并且几十年来一直是面向对象的。他们如何处理操作系统调用实际上只是一个链接细节。作为系统程序员,这对我们来说并不重要,只是链接必须匹配。从 C 调用 C++ 的唯一真正问题不是它的“OO”。问题是 C++ 对其符号使用了一些自定义的名称修饰算法,并非所有 C 编译器都可以处理。

事实上,它的意义远不止于此。但是,如果有人用 C++ 编写所有新的操作系统调用,你可以打赌 C 编译器供应商会找到一种方法来弥补差距,这样你就可以用 C 中舒适的旧 LibnameCallname(cookie,... 风格调用它们。


在我看来,你实际上是在说你不喜欢它是 Parnas 在 1972 年首次提到的 Information Hiding - 如果关于程序各个部分的详细信息,开发人员可以提高生产力的想法工作对其他部分是隐藏的。

当时是非常矛盾的。即使到了九十年代初,我也经常听到关于它的激烈争论。 Fredrick Brooks 甚至在The Mythical Man-Month 中反对它。 (顺便说一句:如果你还没有读过 TMM-M,you need to。)

问题是,今天几乎没有人反对它。这是有原因的。甚至弗雷德布鲁克斯也承认他在 20 年后错了。从他的文章中,Parnas 是对的,而我在信息隐藏方面是错的 -

帕纳斯是对的,我错了。一世 我现在确信信息 隐藏,今天经常体现在 面向对象编程,是 提高水平的唯一途径 软件设计。

公平地说,双方都会同意,在非常小的系统(例如,您一直在使用的嵌入式系统?)上,信息隐藏几乎没有那么必要。只有当系统开始变得非常大时,一个完全互连的系统才会开始因自身的重量而崩溃。但是,今天大多数程序都那么大。这就是争论停止的主要原因。

【讨论】:

  • 实际上允许操作系统系统调用 API 承担 C++ 面向对象的语义就像让操作系统直接使用 struct FILE(可能更复杂除外)。这是在内核空间和用户空间之间共享的大量数据,其中很多是指向其他东西的指针。您还锁定了此结构的布局,并且永远不会对其进行调试。整数句柄更有意义。不过,您可以将整数映射到用户空间 C 程序中的类,并使用 extern "C" 块来实现您所说的。
  • 嗯,其实我今年 20 岁。但是我从汇编程序中学习了编程,主要是在 MCU 上。所以这就是我喜欢 C 并且了解 OOP 的原因,因为它可以更好地控制程序,离你更远一步......
  • @b-gen-jack-o-neil 好吧,您的论点与过去反对 OO 甚至之前的结构化编程的旧 grognards 大体相同。所以我只是假设。我将在附录中解决这个问题,因为这里的字符已经用完了。
【解决方案2】:

一旦平台 API 变为面向对象,很可能将无法选择如何使用它们 - 只有基于 OO 的语言可用。例如。 Android(仅限 Java)、Windows Phone 7(仅限 C#)、WebOS 和 Blackberry(Java、JavaScript)。

一般来说,从纯 C 语言访问类和对象是可能的(但非常重要),但正如前面所说,C 语言在该平台上不会是一个选项。当可移植的 C 代码无法在上述平台上使用时,这已经成为一个问题(幸运的是,Android 提供了用于原生开发的 NDK)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多