为什么有人会选择使用C而不是C++?

159

尽管人们似乎喜欢抱怨C++,但我找不到为什么你会选择C而不是C++的证据。C似乎没有受到太多批评,如果C++存在所有这些问题,为什么不能将自己限制在C子集中?你有什么想法/经验?


精确的重复链接不再起作用了......这是那个来晚了的人说的 :) - kyle
5
C确实比C++更好、更简单,但任何懂得C语言的程序员都可以将C++转换为C并且嘲笑它。 - BobRun
14
可怕的是,一般人认为“++”表示这真的很好,但很抱歉,它并不是。 - BobRun
3
因为JavaScript、最佳实践、C++和面向对象编程等内容都在忙于解决这些可能并不存在或永远不需要解决的抽象问题,所以它们是愚蠢的。 - marshal craft
为什么有人会选择C++而不是C呢...说真的?C++只是一个臃肿的混乱。 - Fredrik
显示剩余5条评论
25个回答

150

Joel的回答对于你可能必须使用C的原因是很好的,不过还有一些其他理由:

  • 您必须符合行业指南,这在C中更容易证明和测试
  • 您可以使用C工具,但不能使用C++(不仅要考虑编译器,还要考虑所有支持工具、覆盖率、分析等)
  • 您的目标开发人员是C专家
  • 您正在编写驱动程序、内核或其他低级代码
  • 您知道C ++编译器无法优化您需要编写的代码类型
  • 您的应用程序不仅不适合面向对象,而且在该形式下编写会更加困难

然而,在某些情况下,您可能想使用C而不是C ++:

  • 您希望获得汇编的性能,但不想编写汇编代码(理论上,C ++能够实现“完美”的性能,但编译器没有像优秀的C程序员那样看到优化)

  • 您编写的软件非常简单或几乎可以忽略不计 - 使用小型C编译器,编写几行代码,编译即可 - 无需打开具有帮助器的大型编辑器,无需编写几乎为空和无用的类、处理名称空间等。您可以使用C ++编译器完成几乎相同的事情,并仅使用C子集,但即使是对于微小的程序,C ++编译器也更慢。

  • 您需要极高的性能或小代码大小,并且知道C ++编译器实际上会因库的大小和性能而使其更难实现。

您认为只需使用C子集并使用C++编译器进行编译,但您会发现如果这样做,根据编译器的不同,结果会略有不同。

无论如何,如果您这样做,就是在使用C。您的问题真的是“为什么C程序员不使用C ++编译器?” 如果是这样,那么您要么不理解语言差异,要么不理解编译器理论。


71
性能方面并不一定正确。在很多领域,C++都比C更能进行优化。(当然反过来也有时是正确的,但一般来说,出于性能考虑选择C而不是C++是一个不好的主意)。 - jalf
12
我很感兴趣获取更多的性能信息。我不明白为什么 C 只有在有时才表现得更好。对于一名普通程序员来说,C++ 可能更容易实现高性能(通过良好的模式使用),但由专家编写的 C 程序应该更快 - 开销更低。 - Adam Davis
23
C++比C更适合编写“漂亮”的代码,它可以使用模板和内联函数,而C则需要使用宏定义。 C++的开销只有在需要时才会出现,否则与C相同(例如virtual、try/throw和dynamic_cast)。大部分开销只会反映在程序镜像大小上。 - Zan Lynx
6
@Zan "C++的开销只有在需要时才会出现,否则与C相同" 很好,我真的很想看一些参考资料。 - Adam Davis
4
在进行数值计算时,使用模板的惰性评估实际上可以比C代码更高效地编写出C++代码。请参见Eigen。实际上,像sort这样的功能在C++ STL中可能比C标准库更快。据我所知,唯一一种情况是当C++大量使用虚函数时,C++二进制文件的表现会比C二进制文件差,但一旦您考虑到C函数指针,这种差异就消失了。完全同意@jalf的观点。 - Aditya Kashi
显示剩余15条评论

139

我喜欢极简主义和简约风格。


9
好的,那为什么不考虑使用Forth呢? - Jonathan Leffler
21
我猜他也喜欢有图书馆、书籍和论坛可用? - gnud
56
我喜欢你回答的简洁和简单风格... :) - Joe DF
13
同意。C语言非常简单且“小巧”。C语言的代码始终看起来一样,如果你是项目的新贡献者,很容易理解它的工作原理。 C++有许多无用的东西,当我看一个C++项目时,我立刻就感到困惑。我可以理解使用C语言实现面向对象的C++语言,但C语言更加简单易懂。 - user69969
4
我完全同意。一个优秀的C程序员可以维护甚至是大型的C应用程序,而不会迷失在所有的废话类和Boost中。 - Vahid Amiri
显示剩余3条评论

71
  • 因为他们已经了解C语言。
  • 因为他们要为只有C编译器的平台构建嵌入式应用程序。
  • 因为他们正在维护用C语言编写的遗留软件。
  • 您正在编写操作系统、关系数据库引擎或零售3D视频游戏引擎之类的内容。

5
一些微控制器只有 C 编译器,这真的很糟糕。基本的 C++ 特性(命名空间、类除了虚函数以外的部分、枚举、在代码块之外声明变量)是我认为最有价值的。 - Jason S
3
从这句话中可以看出,只有在没有合理的替代方案时,你才会选择C语言。 - Joe Calimari
2
@Joe:除了第一点外,这基本概括了。许多后来的编程语言都基于C,并认为“嘿,我们可以做得更好”。 - Joel Coehoorn
1
“零售3D视频游戏”的一个例子是什么? - Marian Paździoch
5
大多数3D游戏引擎都使用C++编写,事实上,UE4主要也是使用C++。 - Aditya Kashi
显示剩余3条评论

60

害怕性能或膨胀不是放弃C++的好理由。每种语言都有其潜在的缺陷和权衡 - 好的程序员了解这些并在必要时开发应对策略,而糟糕的程序员则会遭受失败并责怪语言。

在许多方面,解释型Python被认为是“慢”语言,但对于非平凡任务,熟练的Python程序员可以轻松地编写比经验不足的C开发人员执行更快的代码。

在我的行业中,即视频游戏领域,我们通过避免在内部循环中使用RTTI,异常或虚函数等东西来编写高性能的C++代码。这些可能非常有用,但会带来性能或膨胀问题,因此最好避免。如果我们再进一步完全转向C,我们将获得很少的收益,并失去C++最有用的构造。

更喜欢C的最大实际原因是,它比C++更广泛支持。有许多平台,特别是嵌入式平台,甚至没有C++编译器。

还有供应商的兼容性问题。虽然C具有稳定且定义明确的ABI(应用程序二进制接口),但C++没有。由于vtable和constructurs / destructors等原因,C ++中的ABI更加复杂,因此每个供应商甚至版本的供应商工具链都实现不同。

从实际角度来看,这意味着您无法使用一个编译器生成的库并将其与来自另一个代码或库的二进制库链接起来,这为分布式项目或二进制库的中间件提供者创造了噩梦。


8
Python解释型语言在很多方面被认为是“慢”语言,但对于非平凡的任务,一个熟练的Python程序员可以轻松编写比一个经验不足的C开发人员更快的代码。我猜想一个(不一定是Python程序员)接受过算法课程的程序员可以编写比一个经验不足的开发者(总体而言)更快的代码。 - Andrei Ciobanu
25
同样那个经验不足的C开发者会写出比他的C代码更慢的Python代码。Python比C要慢得多。 - Millie Smith

54

我的观点是:为什么要使用C++而不是C?

书籍《C程序设计语言》(K&R)明确地告诉你如何在不到300页的篇幅内掌握语言的所有技能。它是极简主义的杰作,没有任何一本C++书籍可以与之媲美。

显然的反驳是,大多数现代语言都具备相似的特点--它们也无法用几百页的篇幅讲清楚所有内容。这是事实。那么为什么要选择C++呢?因为它更丰富吗?更强大吗?如果您需要更多的功能或更强大的功能,请选择C#,Objective C,Java或类似的其他语言。为什么要担负C++的复杂性?如果您需要C++提供的控制程度,我认为应该使用C。C可以做任何事情,而且做得很好。


1
我同意。我想要强大的力量,所以我使用真正强大的东西,而不是半途而废。 - Dinah
10
@Dinah:1/2方式点让您具有更高级别的表达能力,而不会像C#或Java那样增加性能和内存成本。 - Zan Lynx
6
@Zan Lynx: 你是对的。但我希望通过在原帖中采取对立的立场来表明C相对于C++的可行性...即使正如你所指出的那样,这并不是一个一劳永逸的情况。 - Dinah

41

我选择使用C语言编写程序,因为我喜欢使用一种小巧而紧凑的语言。我喜欢有一种标准,可以在合理的时间内阅读(对于我来说--我是一个非常慢的读者)。此外,我还用它编写嵌入式系统的软件,这些系统很少有理想的C++编译器存在(例如某些 PIC微控制器)。


关于PICs的问题--我理解你的痛苦。如果我需要编写大量的PIC代码,我可能会使用支持C++的IAR编译器。我已经在MSP430上使用过它,感觉非常不错。 - Jason S
1
不要忘记C语言的大幅编译时间改进。没有模板系统。 - Engineer

34
除了已经提到的几个方面之外:
更少的惊喜,
也就是说,要想知道一段代码会做什么,Python 要容易得多。在 C++ 中,你需要达到高级大师的水平才能精确地知道编译器生成的代码(尝试组合模板、多重继承、自动生成构造函数、虚函数并混入一点命名空间魔法和参数相关的查找)。
在许多情况下,这种“魔法”很好,但例如在实时系统中,它可能会真正搞砸你的一天。

33

我习惯于使用C++来进行我的项目开发。后来我得到了一个工作机会,需要使用纯C语言(一个20年历史的、文档质量不佳的杀毒软件代码库...)。

C语言中我喜欢的三点是:

  • 没有隐式操作:你能够清楚地看到你的程序究竟做了什么或者没做什么。这让调试更简单。

  • 缺少命名空间和重载可以成为优势:如果你想知道某个函数在哪里被调用,只需在源代码目录中使用grep(命令行文本搜索工具),就可以找到它。无需任何其他特殊工具。

  • 我重新发现了函数指针的强大功能。基本上它们允许你执行所有C++中的多态操作,而且它们更加灵活。


9
然而,C语言中这种多态性通常通过void*实现,但这样做是危险的,因为它会禁用编译器检查是否正在进行一些不良操作。 - gd1
7
在实际应用中,我想不起来有一个void*导致了问题。有许多防御性编程技术可以保护免受错误的影响:在每个地方添加asserts断言、在结构体中增加魔数(在调试构建中)等等。但现在我们有valgrind、dr.memory,甚至MSVC工具来检测问题,因此内存损坏问题很容易解决。 - Calmarius
5
我很少在我的程序中遇到内存损坏的情况,但如果可能的话,我更希望在运行程序之前就能检测出错误。把 void* 强制转换为 whatever* 是编译器信任的一种做法。我希望我的编译器不相信我,并有可能强制执行健壮的类型检查。C++ 编译器发出的模板替换错误很难读懂,但至少垃圾代码不会编译。 - gd1
1
@gd1 回到你的第一条评论,我不知道你在过程式技术方面有多少经验(我看到你主要活跃在面向对象的标签中)。void*通常可以避免使用。添加自定义行为的典型模式是传递函数指针和一个void*用于用户数据。通用接口通常如下所示。然后库将此void*传回给您的回调而不进行任何其他操作。大多数情况下,您没有任何额外的数据,因此传递NULL,并在回调中忽略用户参数。我假设您已经知道这一点。 - Calmarius
1
@Calmarius “大多数情况下,您没有任何额外的数据” -> 这实际上是多态性的优点。很容易绑定额外的数据,而不使用void指针。因此,您的借口基本上是“我实际上并没有使用那个功能”。 - user2445507
显示剩余2条评论

27

Linus对你的问题的回答是"因为C++是一种可怕的语言"

他的证据充其量只是一些轶事,但他说得有道理...

C++更多地是一种低级语言,你可能更喜欢它而不是C ++ .. C ++是带有额外库和编译器支持的C语言(两种语言都具有另一种语言没有的功能,并且以不同的方式实现),但如果你有时间和经验使用C,则可以从额外添加的低级相关功能中获得益处... [编辑] (因为你习惯于手动完成更多的工作,而不是从语言/编译器本身获得某些能力)

添加链接:

嵌入式设备为什么要使用C++

为什么还在使用C?PDF

我会谷歌这个问题.. 因为网络上已经有很多评论了


23
我曾经花了很多时间编写C语言代码,然后是短暂的C++时期,接着尴尬地使用VB很长一段时间,现在过去几年我一直在使用C#。自那以后,我写了一些C和C++代码,认识到C定义明确、紧凑,C#酷炫而强大,而C++则很糟糕。 - CMPalmer
27
Linus并不具备评价C++优缺点的资格。将他引用得像个神谕一样是很愚蠢的。而关于“以较困难的方式完成事情”的说法也没什么意义。使用C语言是有好处的,但“它更费力”或者“Linus这么说”并不是其中之一。 - jalf
11
@jalf,不要把Linus的话当作神谕一样引用,提到一个知名程序员对于世界上最常用的程序之一——Linux内核的选择意见是很好的。这个问题要求给出意见(为什么有人会选择C语言),这正是我想回答的。 - Ric Tokyo
7
Linus不是关于C++的意见的好来源,因为他不使用它,据我所知,只在1990年代尝试过一次。 - Zan Lynx
5
@Zan在其他方面表现更自我控制:“我们本来想使用C++并使用其带来的额外功能,但是与C相比,在C++中很难看到糟糕的代码。”我的回答中的引用记录了一种观点,而不是“跟随领袖”。 - Ric Tokyo
显示剩余5条评论

26

编译时间过长可能非常烦人。使用C++,您可能会面临非常长的编译时间(这意味着,在 Stack Overflow 上浏览网页的时间会更多!)。


为什么这个被投票否决了?我自己在C++中做了很多工作,我不会回到C,但它确实可能有痛苦的长编译时间(例如考虑模板)。 - Frank
6
我在实际工作中使用C++,但我总是用C语言进行原型设计,因为编译时间几乎是瞬间的。 - Tom
嗯,当以正确的方式完成时,即不包含臃肿的我们可能需要这些#includes和不确定哪个是正确的include所以我会将它们全部包含的#includes时,编译时间很短。当我在一个或三个文件上进行修改时,只需要1-2秒钟就可以编译我的100 KLOC项目。 - Sebastian Mach
5
@Tom:我想知道你实际工作中的 C++ 是什么样子的,如果你可以用 C 进行原型设计。你没有使用 C++ 的能力吗?你能详细说明一下吗? - Sebastian Mach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接