8

不要再用 C/C++ 的这种说法了!

 1 year ago
source link: https://www.techug.com/post/don-t-use-the-statement-of-adding-c-c-anymore56d7a959352ae10861a7/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

不要再用 C/C++ 的这种说法了!

O1CN01TnL7Ge1OQdrKWfDtm_!!2768491700.jpg_640x640q80_.webp

我们对“C/C++”这种写法或说法似乎在无形之中早已习以为常,然而,这种做法真的是对的吗?

在今天这篇文章中,有开发者呼吁应该立即停止使用“C/C++”这种说法,因为这属于两种完全不同的编程语言,以下是他解释的原因。

原文:https://brycevandegrift.xyz/blog/stop-saying-c-and-c++/

编译 | ChatGPT

责编 | 苏宓

出品 | CSDN(ID:CSDNnews)

在我记忆中,每当有人提到用 C 或 C++ 编写的项目时,他们常常都会用 C/C++ 这样的说法。对于那些从未接触过 C 或 C++ 的大多数人来说,这可能看起来并不是什么大问题。

然而,问题在于当人们使用这个术语(C/C++)时,他们让 C 和 C++ 看起来像是相似或密切相关的编程语言。

事实并非如此。尽管 C++ 最初是基于 C 创建的,但随着时间的推移,这两种语言已经越来越不相似,并且在许多方面也存在差异。因此,建议停止使用”C/C++”这样的说法,而是明确指出是 C 还是 C++,以避免混淆和误导。

C 和 C++ 非常不同

可能会有人说:“嗯,你可以在 C++ 程序中编写 C 代码,所以从技术上讲,C是 C++ 的一个子集。”

但事实上,许多其他编程语言(如 Zig、Go、Nim 等)也可以编写 C 代码,并且几乎所有其他语言都有与 C 的互操作性。

因此,如果仅仅因为可以在 C++ 中使用 C 代码,就将 C 称为 C++ 的子集,那么同样的逻辑也可以应用到其他语言上,是否应该把 Zig、Go 和 Nim 称为 C/Zig、C/Go 和 C/Nim 呢?

显然这种做法不合适。

带有类的 C 语言

有人曾说,“C++ 只是带有类的 C 语言!”

其实说这句话的人显然从未使用过 C++。C++ 具有与 C 语言不同的标准库、实现。在最初开发 C++ 时,它只是在 C 语言的基础上添加了类的特性,但自那时起,C++ 已经实现了与 C 语言不同的功能。

不兼容性

空指针 

C++ 与 C 不兼容的一个例子是空指针的处理。例如,下面这段程序可以使用 C 编译器(如 GCC)进行编译,但无法使用 C++ 编译器(如G++)进行编译:

#include <stdlib.h>int main() {  int *a = malloc(5);  return 0;}

这段代码只是给一个整数指针 a 分配了 5 个字节的内存。当使用 GCC 编译这个程序时,它可以正常运行,但如果使用 G++ 编译这个程序,就会返回以下错误:

main.c: In function 'int main()':main.c:4:24: error: invalid conversion from 'void*' to 'int*' [-fpermissive]    4 |         int *a = malloc(5);      |                  ~~~~~~^~~      |                        |      |                        void*

发生这种情况的原因是 malloc 函数返回一个空指针(void pointer),而 C++ 不能将空指针直接转换为整数指针,除非它明确地转换为整数指针。

K&R 语法

C++ 与 C之间的另一个重要不兼容性是 C++ 实际上与 K&R 语法不兼容。以下以 K&R 语法书写的函数为例:

int gcd(a, b)  int a;  int b;{  if (b == 0)    return a;  return gcd(b, (a % b));}

使用 GCC 编译时,它会完美地编译通过(如预期的那样),然而使用 G++ 编译时,会出现另一组错误。

gcd.c:3:9: error: 'a' was not declared in this scope    3 | int gcd(a, b)      |         ^gcd.c:3:12: error: 'b' was not declared in this scope    3 | int gcd(a, b)      |            ^gcd.c:3:13: error: expression list treated as compound expression in initializer [-fpermissive]    3 | int gcd(a, b)      |             ^gcd.c:6:1: error: expected unqualified-id before '{' token    6 | {      | ^

这使得在 C++ 中使用 K&R 语法几乎不可能,除非你按照 ASCII C 的格式编写函数参数。(我知道很少有人关注 K&R 语法,但我认为这仍然是一个重要的区别)。

还有许多其他在 C 中无法转移到 C++ 的内容,例如复数、默认返回类型等等,但我认为你已经对此有所了解了。如果让 C 与 C++ 一起使用时,这些不兼容性并不会破坏整个 C 语言,但这些小差异会逐渐累积。

对初学者来说很困难

不区分 C 和 C++ 还会产生排斥新用户的副作用。许多初学者程序员被“C/C++”这个术语引导,认为它们基本上是相同的语言。另外,也有许多教程被标榜为“C/C++教程”,进一步加深了混淆。

这也可能使 C 初学者退避三舍,让他们认为要理解 C 必须先理解 C++ 的复杂性(这实则完全没必要)。我以前也曾陷入这个陷阱,还有很多其他人。C 实际上是一种非常简单的编程语言,而 C++ 则不是。

C 和 C++ 程序员非常不同

随着年复一年引入的新的 C++ 标准,如 C++11、C++20 等,C++ 程序员获得了更多在标准 C 中不存在的工具和函数。这通常导致现代 C 程序比现代 C++ 程序具有更多的代码行数,然而这意味着现代 C 通常比现代 C++ 更易读。

以下是来自 LeetCode 的一个示例问题。解决方案可能不同,但大多数 C 语言的解决方案看起来像这样:

int maximumCount(int *nums, int numsSize) {  int pos = 0, neg = 0;  for (int i = 0; i < numsSize; i++) {    if (nums[i] > 0) pos++;    else if (nums[i] < 0) neg ++;  }  return pos > neg ? pos : neg;}

尽管这段代码对于 C 标准来说是相当紧凑的,但它仍然是非常可读的。现在说说 C++ 的解决方案,这个方案有很多变化,所以我将使用一个与 C 足够不同的方案。

int maximumCount(std::vector<int> nums) {auto [a, b] = std::equal_range(nums.begin(), nums.end(), 0);return std::max(std::distance(nums.begin(), a), std::distance(b, nums.end()));}

这使用了 C++ 标准库中的 vector 和算法。正如你所看到的,这段代码要紧凑得多,但绝对没有 C 语言代码的可读性。尽管 C 语言的解决方案可以被 C++ 编译器编译,但我想强调的是它们之间的差异有多大。这只是一个例子,说明 C 和 C++ 程序员在编程方面已经慢慢分离。

许多 C 程序员不愿意接触 C++

我很确定现在每个人都知道 C 程序员的刻板印象,唯一的问题是它是真实的。很多 Suckless 用户和开发者在他们的程序中只使用 C 和 POSIX shell。Cat-v 认可 C 和类 C 语言,但鄙视 C++。即使是 Linux 和 Git 的创造者 Linus Torvalds,也不愿意碰 C++。

如果雇主只想寻找 C 语言开发人员,那么他们更不应该把 C/C++ 放在工作描述中,如果这样做,他们只会吓跑有能力的 C 语言开发者。

解决方案

如果你指的是 C 语言程序或程序员,就说 “C”。如果你指的是一个 C++ 程序或程序员,就说 “C++”。如果你指的是两者分开使用,就说类似的东西:

  • C 和 C++

  • C,C++

  • C++ 与 C

千万不要写——C/C++。

只有当你将 C 和 C++ 一起使用时,才可以说是C/C++。

本文文字及图片出自 CSDN

O1CN01B5VxzS1OQdsdoIXGB_!!2768491700.jpg_640x640q80_.webp

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK