说“C/C++”不是错的吗? [关闭]

Posted

技术标签:

【中文标题】说“C/C++”不是错的吗? [关闭]【英文标题】:Isn't saying "C/C++" wrong? [closed] 【发布时间】:2008-10-07 17:23:43 【问题描述】:

我已经看到很多关于不正确使用“C/C++”表达的问题。 我认为的原因是:

新手 C 和 C++ 程序员可能不了解这两种语言之间的区别。 人们并不真正关心它,因为他们想要一个通用、快速和“肮脏”的答案

虽然 C/C++ 有时可能被解释为“C 或 C++”,但我认为这是一个很大的错误。 C 和 C++ 提供了不同的编程方法,即使 C 代码可以很容易地实现到 C++ 程序中,我认为用一个表达式 ( C/C++ ) 来指代两种不同的语言是错误的。

确实有些问题可以被视为 C 或 C++ 问题,无论如何。 你怎么看?

【问题讨论】:

+1 因为我想在某个时候自己问这个问题。对于使用术语“C/C++”的人:如果您的问题适用于两种语言,只需使用这两个标签。 :-) “C/C++”也可以写成“++C, 1”。它是一个增加 C 并且结果值为 1 的表达式。 C 不是 C++!反之亦然。观点。它们是两种截然不同的语言。任何关于 else 的讨论不仅与 SO 无关,而且完全是错误的。 【参考方案1】:

C/C++ 是 C++ 早期的一个顽固派,当时它们比现在更加相似。起初并没有真正的错误,但越来越多 - 一直如此。

虽然基本结构非常相似,但大多数简单的问题仍然适用于两者。关于这个主题有一篇完整的***文章:http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

由此产生的最大谬误是,因为有人精通 C,所以他们同样擅长 C++。

【讨论】:

由此产生的第二大谬误是,因为有人精通 C++,所以他们同样擅长 C。 @Chris - 当然。我们在大学里用过一些 C++,但从未接触过 C。有人认为我也懂 C,当我告诉他们我不知道时,我笑了。【参考方案2】:

请记住,C++ 的原始实现只是作为一个预编译器,为“真正的”编译器输出 C 代码。所有 C++ 概念都可以用纯 C 手动编码(但不是编译器强制执行)。

“C/C++”在指代编译器和其他语言/编程工具时也有效。几乎每个可用的 C++ 编译器都可以编译 - 因此被称为“C/C++”编译器。大多数都可以选择是根据扩展名处理 .C 和 .CPP 文件,还是将它们全部编译为 C 或全部编译为 C++。

另请注意,从最初的 C/C++ 编译器开始,就可以在单个编译器项目中混合 C 和 C++ 源代码。这可能是模糊语言之间界限的关键因素。

为 C++ 创建的许多语言/编程工具也适用于 C,因为语言语法几乎相同。许多语言工具都有独立的 Java、C#、Python 版本 - 但由于高度相似,它们只有一个适用于 C 和 C++ 的“C/C++”版本。

【讨论】:

上次我检查时,CFront 生成了 C 代码,因为 javac 将生成字节码。这不是预编译。它将 C++ 代码编译成中间可移植代码,即 C,然后应该由 C 编译器编译。【参考方案3】:

我们公司注意到以下奇怪的事实:如果求职者在简历中写了“高级 C/C++ 知识”,那么他很有可能真的什么都不知道;)

【讨论】:

我刚刚注意到我的简历包含“C/C++(20 年)”。也许我应该改变它! :) 如果有人觉得自己都精通,应该怎么写? C 和 C++ 的高级知识?【参考方案4】:

这两种语言是不同的,但它们有很多共同点。很多 C 代码在 C++ 编译器上编译得很好。在早期的学生级别,很多 C++ 代码仍然可以在 C 编译器上运行。

请注意,在某些情况下,代码的含义可能会在两个编译器之间以非常微妙的方式有所不同,但我想在某些情况下,即使在不同品牌的 C++ 编译器之间也是如此,如果你是愚蠢到依赖未定义或有争议/不合规的行为。

【讨论】:

【参考方案5】:

是和不是。

C 和 C++ 有很多共同点(事实上,C 的大部分内容是 C++ 的子集)。

但 C 更面向“强制编程”,而 C++ 除了 C 范式外,还有更多易于访问的范式,如函数式编程、泛型编程、面向对象编程、元编程。

所以我看到“C/C++”项说是“C 和 C++ 的交集”或“熟悉 C 编程以及 C++ 编程”,具体取决于上下文。

现在,这两种语言确实不同,对于类似的问题有不同的解决方案。 C 开发人员会发现很难“解析/理解” C++ 源代码,而 C++ 开发人员则不容易识别 C 源代码中使用的模式。

因此,如果您想在“C/C++”表达式中查看 C 与 C++ 之间的距离,一个很好的比较是 GTK+ C 教程,在 C++ 中也是如此(GTKmm):

C : GTK+ Hello World: http://library.gnome.org/devel/gtk-tutorial/stable/c39.html#SEC-HELLOWORLD

C++ : GTKmm Hello World: http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/sec-helloworld.html

阅读这些资源非常有启发性,因为它们是,就我分析它们而言,产生完全相同的东西,“相同”的方式(就语言而言)。

因此,我想C/C++“表达式”可以通过这些来源的比较来表达。

:-)

所有这一切的结论是,如果在以下情况下使用它是可以的:

描述 C 和 C++ 的交集 描述熟悉 C 编程和 C++ 编程 描述兼容代码

但它不适合:

当不希望兼容性时(在大多数 C++ 项目中,由于非常有限,不希望这样做),有理由将代码保留在 C++(或 C)的子集中以实现与 C(或 C++)的糖果兼容性。 断言 C 和 C++ 可以/应该以相同的方式编码(如上面的 GTK+/GTKmm 示例未显示)

【讨论】:

我猜你会这样做,但我尽量让答案“完整”(没有超出主题)以支持他们的结论/观点。这样,读者将在一篇文章中获得所有有用的信息来评估答案(即,如果写关于 RAII,我至少会举一个例子)【参考方案6】:

我认为这更多的是第二个答案 - 他们想要一些可以轻松集成到他们项目中的东西。

虽然 C 的答案可能不是惯用的 C++(反之亦然),但我认为这是 C++ 的一大卖点——您基本上可以将 C 嵌入其中。如果一个惯用的答案很重要,他们总是可以将 C/C++/C++ 与 STL/C++ 与 boost/etc 一起指定。

lisp 中的答案将非常不可用。但是可以直接使用 C 或 C++ 中的答案。

【讨论】:

在处理 Windows 代码时尤其如此。 C 和 C++ 使用相同的 Win32 API,但获得 .NET 的答案完全没用。【参考方案7】:

是的,C/C++ 非常没用。它似乎是 C++ 新手最常使用的术语。我们只会 C 的顽固分子只会说“C”,而有经验的 C++ 人知道它与 C 有多大的不同,所以他们正确地说“C++”。

即使 C (几乎)是 C++ 的一个子集,这对它们的实际使用并没有任何影响。在现代 C++ 代码中,几乎每一个有趣的 C 特性都令人不悦: C 指针(改用迭代器/智能指针/引用)、宏(改用模板和内联函数)、stdio(改用 iostream)等等。

因此,正如 Alex Jenter 所说,任何熟悉这两种语言的人都不太可能会说 C/C++。说你知道如何用“C/C++”编程就像说你知道如何用“Perl/php”编程......当然它们有一些重要的相似之处,但它们在实际使用方式上的差异是巨大的.

【讨论】:

【参考方案8】:

C/C++ 通常意味着一种编程风格,就像 C 和类,或者 C 和 STL :-) 从技术上讲,它是 C++,但它的优点很少。

【讨论】:

【参考方案9】:

我同意。我阅读了 C 标签的 RSS 提要,我看到大量的 C++ 问题都与 C 没有任何关系。

我也经常看到这种交流: 提问者:你如何在 C 中做到这一点? 答:使用 C++ 的 X 库。 提问者:好的,有人真的用 C 语言回答我的问题怎么样?

【讨论】:

【参考方案10】:

我自己使用这个词,这是因为这是我的风格,我不使用 boost、stl 或其他一些东西,甚至不使用标准 C++ 库,如“cout”和“cin”,我编写 C 但使用类、模板和其他(非库)功能对我有利。

我可以说我不是 C 大师,也不是 C++ 大师,但我非常擅长我从 10 年前开始使用的那种特殊风格。 (而且我还在进步!)

【讨论】:

【参考方案11】:

我的印象是所有 c 代码都是有效的 c++ 代码。

【讨论】:

随着 C++ 的发展,这变得模糊了。它最初是,或者至少是打算如此,但最终并非如此。我找不到确切的时间线,但在 C99 附近的某个地方,它们出现了分歧。 C 有 几个 C++ 没有的东西。我头顶的一个是...函数参数。 现在还有很多代码可以编译,但无论你使用C还是C++,在含义上都有非常细微的差别 哦,是的,不要忘记有时编译器会做一些古怪的事情,这些事情不一定符合标准。所以也许有一些编译器会这样做,或者交叉授粉功能......没有什么说编译器必须完全遵循标准。 这在很大程度上是正确的,但有些地方 C ocde 不是有效的 C++ 代码。一直存在的一个问题是,在 C 中,void 指针被隐式转换为任何具体的指针类型。那是 C++ 中的错误; void 指针必须显式转换。【参考方案12】:

不是说“C/C++”不对吗?

不,不是。例如,Watcom International Corporation,founded more than 25 years ago,将他们的 C 和 C++ 编译器和工具集称为“Watcom C/C++”,该产品仍在开发中,并以开源形式提供,为 OpenWatcom C/C++

【讨论】:

【参考方案13】:

如果是一个需要编写多个函数的复杂问题,是的,这可能是错误的。

如果只是询问有关sprintf或位操作的详细信息,我认为它可以是合法的(后者甚至可以标记为C/C++/Java/C#,我想......)。

【讨论】:

【参考方案14】:

提出问题的人应根据问题编写 C、C++ 或 C/C++。

据我所知,您可以使用C 方式C++ 方式 编写C++ 代码。两者都可以,但是从长远来看,非 C 风格编写的 C++ 代码通常更容易维护。

最后,这一切都取决于特定的问题。如果有人问如何连接字符串,那么他是否想要 C 或 C++ 解决方案非常重要。或者,另一个例子,如果有人要求一个 qsort 算法。为了支持不同的类型,您可能需要在 C 中使用宏,在 C++ 中使用模板等。

【讨论】:

【参考方案15】:

评论太长了,所以我不得不把它作为答案,但这是对 Jeff B 的回答的回应。

请记住原来的 C++ 的实现就像 输出 C 代码的预编译器 “真正的”编译器。

我有一个朋友(他编写 C++ 编译器——是的,复数),他会冒犯你的第一句话。目标代码是 C 源代码的编译器与其他任何编译器一样都是编译器。编译器的本质是它理解语言的语法,并在此基础上生成新代码。预处理器对语言一无所知,只是重新格式化其输入。

请记住,将编译那些 C++ 编译器的输出的 C 编译器本身会输出 ASM 代码,然后将通过汇编器运行。

【讨论】:

【参考方案16】:

我倾向于在我的问题中使用 C/C++。

通常我正在寻找可以在我的 c++ 应用程序中使用的东西。

如果代码是用 C 或 C++ 编写的,那么我可以使用它,所以我宁愿不只是将可能的答案限制在其中一个。

【讨论】:

【参考方案17】:

这两种语言不仅不同,而且方法也不同。 C++ 是面向对象语言,而 C 是过程语言。

我必须提及模板吗?

此外,C 和 C++ 标准也存在差异。如果某些东西在 C 中很好,则不必在 C++ 中编译

【讨论】:

以上是关于说“C/C++”不是错的吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JFrame怎样关闭

为啥微软用c、c++而不是c#来开发windows? [关闭]

满足条件时是不是可以在 GLSL 着色器中回调 C/C++ 函数/代码? [关闭]

初始化数组是不是保留其在 C/C++ 和类似语言中的顺序? [关闭]

WINDOW窗口自动关闭

用于 C/C++ 的便携式 zip 库(不是应用程序)[关闭]