为什么有人会使用C + +?
尽pipe人们似乎喜欢抱怨 C ++,但我还是无法find很多证据来certificate为什么要selectC ++。 C似乎没有得到几乎一样的低估,如果C ++有这些问题,为什么不能把自己限制在C子集? 你有什么想法/经验?
乔尔的答案是有好处的,你可能需要使用C,尽pipe还有其他一些:
- 您必须符合行业准则,这些准则在C中更容易certificate和testing。
- 你有工具来处理C,但不是C ++(不仅要考虑编译器,还要考虑所有的支持工具,覆盖范围,分析等)
- 你的目标开发者是C大师
- 您正在编写驱动程序,内核或其他低级代码
- 您知道C ++编译器不擅长优化您需要编写的代码types
- 你的应用程序不仅不适合面向对象,而且难以用这种forms来书写
但在某些情况下,您可能想要使用C而不是C ++:
- 您希望汇编程序的性能没有汇编程序编码的麻烦(理论上,C ++能够实现“完美”的性能,但编译器并不擅长看到好的C程序员将看到的优化)
- 你正在编写的软件是微不足道的,或者几乎是这样 – wh出小小的C编译器,编写几行代码,编译和设置 – 无需使用助手打开一个大型编辑器,无需实际编写空的和无用的类,处理命名空间等等。你可以用C ++编译器做几乎相同的事情,并简单地使用C子集,但C ++编译器速度较慢,即使对于小型程序也是如此。
- 您需要极高的性能或较小的代码大小,并且知道由于库的大小和性能,C ++编译器实际上难以完成
你争辩说,你可以使用C子集并用C ++编译器进行编译,但是你会发现,如果你这样做的话,你会得到稍微不同的结果,这取决于编译器。
无论如何,如果你这样做,你使用C.你的问题真的是“为什么不C程序员使用C ++编译器? 如果是这样,那么你要么不懂语言的差异,要么你不懂编译器理论。
- 因为他们已经知道C.
- 因为他们正在为只有C编译器的平台构buildembedded式应用程序
- 因为他们正在维护用C语言编写的遗留软件
- 你正在写操作系统,关系数据库引擎或零售3Dvideo游戏引擎。
我喜欢极简主义和简单。
性能或膨胀的恐惧并不是放弃C ++的理由。 每种语言都有其潜在的缺陷和折衷 – 优秀的程序员学习这些知识,并在必要时制定应对策略,糟糕的程序员会犯规,并责怪语言。
解释的Python在许多方面被认为是一个“慢”的语言,但是对于非平凡的任务来说,熟练的Python程序员可以很容易地生成比没有经验的C开发者更快的代码。
在我的行业,电子游戏中,我们使用C ++编写高性能代码,避免在内部循环中使用RTTI,exception或虚函数。 这些可能是非常有用的,但有性能或膨胀问题,这是需要避免的。 如果我们要更进一步,完全切换到C,我们将获得很小的收益,并失去C ++最有用的结构。
最喜欢C的最大的实际原因是支持比C ++更广泛。 有很多平台,特别是embedded式平台,甚至没有C ++编译器。
供应商也有兼容性问题。 虽然C有一个稳定和明确的ABI(应用程序二进制接口),但C ++却没有。 C ++中的ABI由于诸如vtables和constructurs / destructor之类的东西而变得更加复杂,所以对于每个供应商,甚至是供应商工具链的版本,实现都是不同的。
实际上,这意味着你不能把一个编译器生成的库链接到另一个编译器的库或者代码库中,这会给分布式项目或二进制库的中间件提供者带来噩梦。
我select用C语言编写,因为我喜欢用一种小而紧的语言来工作。 我喜欢有一个可以在合理的时间内阅读的标准(对我来说 – 我是一个非常慢的读者)。 此外,我用它来编写embedded式系统的软件,因为这些embedded式系统只有很less的C ++编译器(像一些 PIC微控制器)。
我采取另一种观点:为什么使用C ++而不是C?
The C Programming Language (又名:K&R)这本书清楚地告诉你如何做300页以下的语言。 这是极简主义的杰作。 没有C ++书甚至接近。
显而易见的反驳是,即使不是所有的现代语言也可以这样说 – 他们也不能告诉你怎么做只有几百页。 真正。 那么为什么要用C ++呢? function丰富? 功率? 如果你需要更多的function丰富或function强大的话,请使用C#,Objective C,Java或其他类似的东西。 为什么为C ++的复杂性增加负担? 如果你需要控制C ++的授权程度,那么我认为使用C. C可以做任何事情,可以做得很好。
因为他们正在编写一个插件而C ++没有标准的ABI。
长的编译时间可能很烦人。 使用C ++,你可以有很长的编译时间(这意味着,当然,更多的时间堆栈溢出!)。
Linus对你的问题的回答是“因为C ++是一种可怕的语言”
他的证据充其量是轶事,但他有一点。
作为一个低级语言,你更喜欢C ++。C ++是C语言,增加了库和编译器支持额外的function( 这两种语言都具有其他语言不具备的function,而且实现方式不同 ),但是如果你有C的时间和经验,你可以受益于额外的低级相关的权力… [编辑] (因为你习惯于手动做更多的工作,而不是从语言/编译器本身的权力中获益)
添加链接:
为什么要embeddedC ++
你为什么还在用C? PDF
我会为此谷歌 ..因为有很多networking上的评论已经
除了其他几点已经提到:
减less惊喜
也就是说,看到一段代码确实会做什么更容易。 在C ++中,您需要接近大师级别,以便能够准确知道编译器生成的代码(尝试组合模板,多重inheritance,自动生成的构造函数,虚函数以及混合一些名称空间魔法和参数相关查找)。
在很多情况下,这种魔法是很好的,但是例如在实时系统中,它真的可以让你的一天变得糟糕。
我习惯于将C ++用于我的项目。 然后,我find了一个使用纯C的工作(一个20年的AV软件不断发展的代码库,文档很差…)。
C中我喜欢的三件事是:
-
没有什么是隐含的:你看到你的程序究竟做了什么或不做什么。 这使debugging更容易。
-
缺less名称空间和重载可能是一个优点:如果你想知道某个函数被调用的地方,只要grep通过源代码目录,它会告诉你。 没有其他特殊的工具需要。
-
我重新发现了函数指针的function。 基本上它们允许你在C ++中做所有的多态的东西,但是它们更加灵活。
我很惊讶没有人提到图书馆。 许多语言可以链接到C库并调用C函数(包括带有extern“C”的C ++)。 C ++几乎是唯一可以使用C ++库(定义为“使用C ++中不在C中的特性的库[例如重载函数,虚拟方法,重载操作符…],并且不会导出一切通过C兼容接口通过extern“C”“)。
如果你想让你的代码被几乎所有的程序员理解,
因为他们想要使用C99中没有C ++中的等价物的function。
但是,乍看之下,并没有像C ++那样有用的C99特性。 变长数组? C ++有std :: vectors。 支持复杂/虚数? C ++有一个模板化的复杂types。 types通用math函数? C ++重载了标准的math函数,导致相同的结果。
命名初始化器? 不是在C ++中,但有一个解决方法:
struct My_class_params { int i; long j; std::string name; My_class_params& set_i(int ii) { i = ii; return *this; } My_class_params& set_j(long jj) { j = jj; return *this; } template <typename STRING> My_class_params& set_name(STRING&& n) { name = std::forward<STRING>(n); return *this; } My_class_params() { // set defaults } }; class My_class { My_class_params params; public: My_class(const My_class_params& p) : params(p) { } ... };
这可以让你写下如下的东西:
My_class mc(My_class_params().set_i(5).set_name("Me"));
因为对于许多编程任务C更简单,而且足够好。 特别是在编写轻量级实用程序时,我可以感觉到C ++希望我自己创build一个优雅的超级代码,而不是简单地编写代码。
OTOH,对于更复杂的项目,优雅提供比自然stream出我的键盘更好的牢固的结构严谨性。
c ++的大多数重要function都涉及类或模板。 除了编译器将其转换为目标代码的方式外,这些function都非常棒。 大多数编译器都使用名称修饰,而那些至less不做任何事情的东西就是混乱的。
如果你的系统是独立存在的,就像许多应用程序一样,那么C ++是一个不错的select。
如果您的系统需要与不是用C ++编写的软件进行交互(最常用的是汇编程序或Fortran库),那么您就处于一个狭窄的位置。 要与这些案例进行交互,您需要禁用这些符号的名称修改。 这通常是通过声明这些对象extern "C"
,但是它们不能是模板,重载函数或类。 如果这些可能是您的应用程序API,那么您将不得不用辅助函数来包装它们,并使这些函数与实际的实现保持同步。
实际上,C ++语言提供了一个标准的语法,可以在纯C中轻松实现。
简而言之,对于大多数人来说,可互操作的C ++的开销太高了。
关于“只使用你想使用的C ++的子集”的一句话:这个想法的问题是强制项目中的每个人都使用相同的子集是有代价的。 我个人的观点是,对于松散耦合的项目(例如开源项目),这些代价是相当高的,而且C ++完全不能成为一个更好的C,因为无论你使用哪个C,都不能使用C ++。
这是相当浅的,但作为一个忙碌的学生,我select了C,因为我认为C ++将花费太长时间学习。 我大学的许多教授不会接受Python中的任务,我需要快速地完成任务。
哦,我的C和C ++,是开始火焰战争的好方法。 🙂
我认为C对驱动程序和embedded式代码更好。
C ++有一些C没有的强大function,但是C ++的许多面向对象的function可能会导致在人们编写代码时出现非常明显的副作用,这些副作用发生在幕后。 疯狂的代码可以隐藏在构造函数,析构函数,虚函数等等… C代码的美妙之处在于,语言在背后不做任何非显而易见的事情,因此您可以阅读代码,而不必查看每个构造函数和析构函数等等。 很多问题是一些人的糟糕的编码习惯。
我的完美语言将是C99加上更安全的C ++function的最小子集的组合,它将零编译器开销(或接近零)编译器开销添加到二进制输出。 完美的增加将是类封装和数据和函数的命名概念。
我会说C比C ++更好地控制优化和效率,因此在内存和其他资源有限且每个优化都有所帮助的情况下,它将非常有用。 当然它的占地面积也比较小。
我还没有find很多的证据来certificate你为什么要selectC ++。
你很难打电话来说我要说什么证据。 这只是我的意见。
人们喜欢C,因为它很适合prgrammer的思想。
C ++有许多复杂的规则[你什么时候需要虚拟析构函数,什么时候可以在构造函数中调用虚拟方法,如何重载和重写,…],掌握它们都需要付出很大的努力。 而且,在引用,运算符重载和函数重载之间,理解一段代码可能会要求您理解可能或不容易find的其他代码。
关于为什么组织会比C ++更喜欢C的另一个问题。 我不知道,我只是一个人;-)
在C ++的防御中,它确实为桌面带来了有价值的特性; 我最看重的一个可能是参数('ish)多态性,但是:操作和types将一个或多个types作为参数。
因为你正在为资源紧张的系统(比如embedded式系统,或者像内核这样的真正的裸机代码)编写一个系统,而且你想尽可能less的开销。
大多数embedded式系统没有C ++编译器的原因是有原因的 – 人们不需要C ++编译器,那就是把C ++代码塞进这个小小的空间是不可能的。
也有一些商店采取类似C的方式来使用C ++的一些function,但是避免了那些令人反感的方法。 例如,使用类和类方法以及函数重载(即使C顽固分子通常很容易处理),而不是STL,stream操作符和Boost(它们更难以学习,并且可能具有不良的内存特性)。
C需要的是一个更好的预处理器。 cfront是一个,因此诞生了C ++
我将使用C,'c ++作为预处理器'将不会好。
我敢肯定,在任何写得很好的c ++库/框架/工具箱的底部,你会发现脏旧c(或静态转换,这是相同的)
- 直到几年前,现有的C ++编译器都缺less重要的function,或者支持function很差,支持的function在它们之间差异很大,因此很难编写可移植的应用程序。
- 由于没有标准的符号命名,所以其他语言/应用程序很难直接支持C ++类。