为什么有人会使用C over C ++?

时间:2009-01-31 00:15:49

标签: c++ c

虽然人们似乎喜欢complain关于C ++,但我还没有找到很多证据证明你为什么要选择C over C ++。 C似乎没有得到几乎同样多的瑕疵,如果C ++有所有这些问题,为什么你不能把自己限制在C子集?你有什么想法/经历?

25 个答案:

答案 0 :(得分:122)

Joel的答案很好,因为你可能 使用C,尽管还有其他几个:

  • 您必须符合行业准则,这些准则在C中更容易证明和测试。
  • 您有工具可以使用C,但不能使用C ++(不仅要考虑编译器,还要考虑所有支持工具,覆盖范围,分析等)
  • 您的目标开发人员是C大师
  • 您正在编写驱动程序,内核或其他低级代码
  • 您知道C ++编译器不擅长优化您需要编写的代码类型
  • 你的应用程序不仅不适合面向对象,而且更难以用这种形式书写

但在某些情况下,您可能希望使用C而不是C ++:

  • 你想要汇编程序的性能,而不需要在汇编程序中编写代码(理论上,C ++能够提供'完美'的性能,但是编译器并不擅长看到优秀的C程序员会看到的优化)
  • 你正在编写的软件是微不足道的,或几乎是如此 - 甩掉微小的C编译器,编写几行代码,编译并完成所有设置 - 无需打开一个带帮助程序的巨大编辑器,不需要写几乎空的和无用的类,处理命名空间等等。你可以用C ++编译器做几乎相同的事情,只使用C子集,但C ++编译器速度较慢,即使对于小型程序也是如此。
  • 您需要极高的性能或较小的代码大小,并且知道C ++编译器实际上会因为库的大小和性能而难以实现

你认为你可以使用C子集并使用C ++编译器进行编译,但你会发现,如果你这样做,你会得到略有不同的结果,具体取决于编译器。

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

答案 1 :(得分:77)

我喜欢极简主义&简单。

答案 2 :(得分:65)

  • 因为他们已经知道C
  • 因为他们正在为只有C编译器的平台构建嵌入式应用程序
  • 因为他们正在维护用C语言编写的传统软件
  • 您正在写一些关于操作系统,关系数据库引擎或零售3D视频游戏引擎的内容。

答案 3 :(得分:52)

担心性能或膨胀不是放弃C ++的好理由。每种语言都有其潜在的陷阱和权衡 - 优秀的程序员可以了解这些,并在必要时制定应对策略,糟糕的程序员会犯规并责备语言。

解释Python在许多方面被认为是一种“慢”语言,但对于非平凡的任务,熟练的Python程序员可以轻松生成比没有经验的C开发人员执行速度更快的代码。

在我的行业,视频游戏中,我们通过避免内部循环中的RTTI,异常或虚函数等内容在C ++中编写高性能代码。这些可能非常有用,但具有可避免的性能或膨胀问题。如果我们要更进一步并完全切换到C,我们将获得很少的东西并失去最有用的C ++结构。

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

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

实际上,这意味着您不能使用由一个编译器生成的库并将其与代码或另一个库中的库链接,这会为分布式项目或二进制库的中间件提供程序造成噩梦。

答案 4 :(得分:35)

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

答案 5 :(得分:34)

我采取另一种观点:为什么使用C ++代替C?

这本书The C Programming Language(又名:K& R)清楚地告诉你如何在300页以内完成语言所能做的一切。这是极简主义的杰作。没有C ++的书甚至接近。

显而易见的反驳是,大多数(如果不是全部)现代语言也可以这样说 - 他们也无法告诉你如何在几百页内完成所有事情。真正。那么为什么要使用C ++呢?功能丰富?功率?如果您需要更丰富或更强大的功能,那么请使用C#,Objective C,Java或类似的东西。为什么要担心C ++的复杂性呢?如果您需要C ++授予的控制程度,那么我认为使用C. C可以做任何事情并且可以做得很好。

答案 6 :(得分:27)

Linus对您的问题的回答是"Because C++ is a horrible language"

他的证据充其量只是轶事,但他有一点......

更多的是低级语言,你更喜欢C ++ .. C ++是C,增加了库和编译器支持额外的功能(both languages have features the other language doesn't, and implement things differently),但如果你有时间和经验C,您可以从额外增加的低级别相关权力中受益... [已编辑] (因为您习惯手动执行更多工作,而不是受益于来自该语言的某些权力/编译器本身)

添加链接:

Why C++ for embedded

Why are you still using C? PDF

我会google为此...因为网上已有很多评论

答案 7 :(得分:27)

除了已提到的其他几点:

少惊喜

也就是说,更容易看到一段代码将做什么完全。在C ++中,您需要接近大师级别才能确切地知道编译器生成的代码(尝试模板,多重继承,自动生成的构造函数,虚函数的组合,并混合使用一些命名空间魔术和参数依赖查找)。 / p>

在许多情况下,这种魔力很不错,但是在实时系统中它可能会让你的日子变得糟透了。

答案 8 :(得分:26)

因为他们正在编写插件而C ++没有标准的ABI。

答案 9 :(得分:25)

漫长的编译时间可能很烦人。使用C ++,您可以拥有非常长的编译时间(这意味着Stack Overflow会有更多时间!)。

答案 10 :(得分:23)

我习惯在我的项目中使用C ++。然后我得到了一个使用普通C的工作(一个20年前不断发展的AV软件代码库,文档很差......)。

我喜欢的三件事是:

  • 没有任何暗示:你看到你的程序究竟做了什么或不做了什么。这使调试更容易。

  • 缺少命名空间和重载可能是一个优点:如果你想知道某个函数的调用位置,只需要浏览源代码目录,它就会告诉你。不需要其他特殊工具。

  • 我重新发现了函数指针的强大功能。基本上它们允许你做你在C ++中做的所有多态的东西,但它们更灵活。

答案 11 :(得分:15)

我很惊讶没有人提到过图书馆。许多语言可以链接到C libs并调用C函数(包括带有extern“C”的C ++)。 C ++几乎是唯一可以使用C ++库的东西(定义为'使用C ++中不在C中的特性的库[比如重载函数,虚方法,重载运算符......],并且不导出一切都通过C兼容接口通过extern“C”')。

答案 12 :(得分:14)

如果您希望几乎任何程序员都能用C语言来理解您的代码。

答案 13 :(得分:12)

因为他们想要在C99中使用C ++中没有等价物的功能。


但是,人们认为乍一看没有那么多对C ++有用的C99功能。可变长度数组? C ++有std :: vectors。支持复数/虚数? C ++有一个模板化的复杂类型。类型通用数学函数? C ++重载了标准的数学函数,导致相同的结果。

命名初始值设定项?不是在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"));

答案 14 :(得分:10)

因为对于许多编程任务,C更简单,更好。当我特别编写轻量级实用程序时,我觉得C ++希望我自己构建一个优雅的超结构,而不是简单地编写代码。

OTOH,对于更复杂的项目,优雅提供了比从键盘自然流出的更好的结构严谨性。

答案 15 :(得分:8)

c ++的大多数重要功能都涉及到类或模板。除了编译器将这些转换为目标代码的方式之外,这些都是很棒的功能。大多数编译器使用名称修改,而那些不做任何事情的编译器至少就像混乱一样。

如果您的系统独立存在,就像许多应用程序一样,那么C ++是一个不错的选择。

如果您的系统需要与不是用C ++编写的软件(最常见的是汇编程序或Fortran库)进行交互,那么您就处于紧张状态。要与这些类型的案例进行交互,您需要为这些符号禁用名称重整。这通常是通过声明那些对象extern "C"来完成的,但它们不能是模板,重载函数或类。如果那些可能是你的应用程序API,那么你将不得不用辅助函数包装它们,并使这些函数与实际的实现保持同步。

实际上,C ++语言为可以在纯C中轻松实现的功能提供标准语法。

简而言之,可互操作的C ++的开销对于大多数人来说太高了。

答案 16 :(得分:8)

这很浅薄,但作为一个忙碌的学生,我选择了C,因为我认为C ++需要很长时间才能学习。我大学的许多教授都不会接受Python的作业,我需要快速学习。

答案 17 :(得分:6)

关于“只使用你想要使用的C ++子集”的一句话:这个想法的问题在于强制执行项目中的每个人都使用相同的子集。我自己的观点是松散耦合项目(例如开源项目)的成本相当高,而且C ++完全没有成为更好的C,因为无论你在哪里用C都不能使用C ++。

答案 18 :(得分:5)

哦,我的C vs C ++,是开始火焰战争的好方法。 :)

我认为C更适合驱动程序和嵌入式代码。

C ++有一些C没有的强大功能,但是当人们编写具有在幕后发生的非明显副作用的代码时,C ++的许多面向对象特性会导致巨大的编码混乱。疯狂的代码可以隐藏在构造函数,析构函数,虚函数中...... C代码的美妙之处就是语言在你的背后没有什么不明显的,因此你可以阅读代码而不必查看每个构造函数和析构函数等等。很多问题都是有些人编写错误的做法。

我完美的语言将是C99和最安全的C ++功能的最小子集的组合,它将ZERO(或接近零)编译器开销添加到二进制输出。完美的补充是类封装和数据和函数的命名概念。

答案 19 :(得分:4)

  

我无法找到很多证据证明你为什么要选择C over C ++。

你很难说出我要说的证据;这只是我的意见。

人们喜欢C,因为它非常符合prgrammer的思想。

C ++有许多复杂的规则[什么时候需要虚拟析构函数,何时可以在构造函数中调用虚方法,如何重载和重写交互,...],并掌握它们都需要花费很多精力。此外,在引用,运算符重载和函数重载之间,理解一段代码可能需要您理解其他可能很容易找到的代码。

一个不同的问题,为什么组织更喜欢C而不是C ++。我不知道,我只是一个人; - )

在C ++的辩护中,它确实为表格带来了有价值的功能;我最重视的那个可能是参数('ish)多态,但是:将一个或多个类型作为参数的操作和类型。

答案 20 :(得分:3)

我认为C可以让您更好地控制优化和效率,因此在内存和其他资源有限且每个优化都有帮助的情况下非常有用。当然,它的占地面积也较小。

答案 21 :(得分:2)

还有一些商店以类似C的方式使用某些 C ++的功能,但避免使用那些令人反感的方法。例如,使用类和类方法以及函数重载(对于偶数C顽固分子来说通常很容易应对),而不是STL,流操作符和Boost(它们更难学习并且可能具有不良的内存特性)。

答案 22 :(得分:1)

C需要的是更好的预处理器。 cfront是一个,因此诞生了c ++

我使用C,其中'c ++ as preprocessor'不行。

我很确定,在任何编写良好的c ++库/框架/工具包的底部, 你会发现dirty-old-c(或静态演员,这是相同的)

答案 23 :(得分:1)

因为您正在为资源紧张的系统(例如嵌入式系统,或某种内核等真正的裸机代码)编写代码,并且您希望尽可能减少开销。

大多数嵌入式系统都没有C ++编译器是有原因的 - 并不是人们不想要一个C ++编译器,而是将C ++代码塞入那个小空间是不可能完成的任务。

答案 24 :(得分:0)

  • 直到几年前,现有的C ++编译器缺少重要的功能,或者支持很差,支持的功能在它们之间变化很大,因此很难编写便携式应用程序。
  • 由于没有标准的符号命名,其他语言/应用程序很难直接支持C ++类。