尽管人们似乎喜欢抱怨 C ++,但是我仍然找不到很多证据来证明为什么您会选择C而不是C ++。C似乎并没有那么强大,如果C ++遇到所有这些问题,为什么不将自己局限于C子集呢?您的想法/经验是什么?
尽管人们似乎喜欢抱怨 C ++,但是我仍然找不到很多证据来证明为什么您会选择C而不是C ++。C似乎并没有那么强大,如果C ++遇到所有这些问题,为什么不将自己局限于C子集呢?您的想法/经验是什么?
Answers:
由于您可能不得不使用C的原因,Joel的回答很好,尽管还有其他一些原因:
但是,在某些情况下,您可能想使用C而不是C ++:
您认为您可以只使用C子集并使用C ++编译器进行编译,但是您会发现,如果这样做,根据编译器的不同,结果会略有不同。
无论如何,如果您这样做的话,就是在使用C。您的问题是否真的是“为什么C程序员不使用C ++编译器?” 如果是这样,那么您要么不了解语言差异,要么不了解编译器理论。
我喜欢简约和简单。
对性能或膨胀的恐惧不是放弃C ++的充分理由。每种语言都有其潜在的陷阱和折衷-优秀的程序员了解这些问题并在必要时制定应对策略,可怜的程序员会犯规并归咎于该语言。
解释过的Python在许多方面都被认为是“慢速”语言,但是对于非平凡的任务,熟练的Python程序员可以轻松地生成比没有经验的C开发人员执行速度更快的代码。
在我的行业(视频游戏)中,我们通过避免内部循环中的RTTI,异常或虚函数之类的事情,用C ++编写高性能代码。这些功能可能非常有用,但存在性能或膨胀问题,需要避免。如果我们走得更远并完全切换到C语言,我们将收获很少,并且会失去最有用的C ++结构。
选择C语言的最大实际原因是支持比C ++更为广泛。有很多平台,尤其是嵌入式平台,甚至没有C ++编译器。
供应商之间也存在兼容性问题。尽管C具有稳定且定义明确的ABI(应用程序二进制接口),但C ++没有。由于vtables和structurs / destructor之类的问题,C ++中的ABI更加复杂,因此每个供应商,甚至供应商工具链的版本都以不同的方式实现。
实际上,这意味着您不能使用由一个编译器生成的库并将其与代码链接,也不能将其与另一个编译器链接,这会给分布式项目或二进制库的中间件提供程序带来噩梦。
我采取另一种观点:为什么使用C ++而不是C?
《C编程语言》(又名:K&R)这本书清楚地告诉您如何在300页以内的语言中完成所有的工作。这是极简主义的杰作。甚至没有C ++书籍可以接近。
明显的反驳是,即使不是全部,大多数现代语言也可以说同样的话-它们也无法告诉您如何仅用几百页就能完成所有工作。真正。那么为什么要改用C ++呢?功能丰富吗?功率?如果您需要功能更丰富或更强大的功能,则可以使用C#,Objective C,Java或类似的功能。为什么要负担C ++的复杂性?如果您需要C ++授予的控制程度,那么我主张使用C。C可以做任何事情,并且可以做得很好。
Linus对您的问题的回答是“因为C ++是一种可怕的语言”
他的证据充其量只是传闻,但他有一点道理。
作为低级语言,您更喜欢C ++。.C ++是C语言,具有添加的库和编译器对额外功能的支持(两种语言都具有其他语言所没有的功能,并且实现方式有所不同),但是如果您有使用C的时间和经验,您可以从额外的低级相关功能中受益... [编辑](因为您习惯于手动完成更多工作,而不是受益于语言/编译器本身的某些功能)
添加链接:
我会用谷歌搜索..因为网络上已经有很多评论
较长的编译时间可能很烦人。使用C ++,您的编译时间可能会很长(当然,这意味着要花更多的时间进行堆栈溢出!)。
我习惯将C ++用于我的项目。然后我得到一份使用纯C的工作(20年来不断发展的AV软件代码库,文档不完善...)。
我喜欢用C编写的三件事:
没有什么隐含的内容:您可以看到您的程序确切执行或不执行的操作。这使调试更加容易。
缺少名称空间和重载可能是一个优点:如果您想知道某个函数的调用位置,只需在源代码目录中进行grep,它就会告诉您。无需其他特殊工具。
我重新发现了函数指针的功能。基本上,它们允许您执行在C ++中所做的所有多态操作,但是它们甚至更加灵活。
void*
引起麻烦。有许多防御性的编程技术可以防止错误:将断言放到任何地方,在您的结构中(在调试版本中)添加幻数,等等。但是如今,我们有valgrind博士。内存,甚至MSVC都使用代码来检测问题,因此很容易找出内存损坏问题。
void*
转换whatever*
为编译器真诚接受的东西。我更喜欢编译器不要相信我,并且可以执行健壮的类型检查。C ++编译器发出的模板替换错误很难读,但至少不能编译垃圾。
void*
通常是可以避免的。添加自定义行为时的典型模式是传递函数指针和void*
用于用户数据的。通用接口通常看起来像这样。然后,库在将其传递void*
回您的回调时不对其进行任何其他处理。大多数情况下,您没有任何额外的数据,因此您传递NULL,并忽略回调中的user参数。我以为你知道这一点。
我很惊讶没有人提到图书馆。许多语言都可以链接到C库并调用C函数(包括带有外部“ C”的C ++)。C ++几乎是唯一可以使用C ++库的东西(定义为“一个库,它使用C语言中不在C语言中的功能(例如,重载函数,虚方法,重载运算符,...],并且不导出)通过外部“ C”'通过C兼容接口进行所有操作)。
如果您想让几乎所有程序员都可以理解您的代码,请使用C编写。
因为他们想使用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"));
std:vector
。
C ++的大多数重要功能都以某种方式涉及类或模板。这些是很棒的功能,除了编译器将它们转换为目标代码的方式之外。大多数编译器使用名称修饰,而那些至少不做一些混乱的操作。
如果您的系统像许多应用程序一样独立运行,那么C ++是一个不错的选择。
如果您的系统需要与不是必须用C ++编写的软件进行交互(通常是在汇编器或Fortran库中),那么您将处于困境。要与这种情况进行交互,您需要禁用这些符号的名称修饰。这通常是通过声明那些对象来完成的extern "C"
,但是它们不能是模板,重载函数或类。如果这些很可能是您的应用程序API,则必须使用帮助程序功能将它们包装起来,并使这些功能与实际实现保持同步。
实际上,C ++语言为可以在纯C中轻松实现的功能提供了标准语法。
简而言之,对于大多数人来说,可互操作的C ++开销太大了。
这很肤浅,但是作为一个忙碌的学生,我选择了C,因为我认为C ++的学习时间会太长。我大学的许多教授都不会接受Python作业,我需要快速上手。
噢,我的C与C ++,这是开始一场火焰大战的好方法。:)
我认为C更适合驱动程序和嵌入式代码。
C ++具有C所没有的一些强大功能,但是当人们编写具有明显副作用的代码时,C ++的许多面向对象功能可能会造成巨大的代码混乱。疯狂的代码可以隐藏在构造函数,析构函数,虚函数中,... C代码的美在于该语言在背后没有任何明显的作用,因此您可以阅读代码,而不必查看每个构造函数和析构函数等等。许多问题是某些人的不良编码习惯。
我的理想语言是C99加上安全C ++功能的最小子集的组合,该功能会在二进制输出中增加零(或接近零)的编译器开销。完美的补充将是数据和函数的类封装和命名概念。
关于为什么为什么要选择C而不是C ++,我还没有找到很多证据。
你几乎不能称呼我要说的证据。这只是我的意见。
人们喜欢C,因为它很好地适合了程序员的思想。
C ++有很多复杂的规则[什么时候需要虚拟析构函数,什么时候可以在构造函数中调用虚拟方法,重载和重载如何交互,...]并掌握它们全部需要花费很多精力。同样,在引用,运算符重载和函数重载之间,理解一段代码可能会要求您理解其他可能很难找到的代码。
为什么组织更喜欢C而不是C ++的另一个问题。我不知道,我只是一个人;-)
为了捍卫C ++,它的确为表带来了宝贵的功能。不过,我最重视的一种可能是参数('ish)多态:以一种或多种类型作为参数的操作和类型。
++score
:您的陈述“人们喜欢C,因为它很适合程序员的思想”,这是一个非常好的陈述。能够使用一种简单的语言进行编程,在这种语言中,您所看到的就是所得到的,这对于编程语言来说是一个真正吸引人的特性。
我想说C比C ++可以更好地控制优化和效率,因此在内存和其他资源有限且每次优化都有帮助的情况下很有用。当然,它的足迹也较小。
因为您是在为资源紧张的系统(例如嵌入式系统或某种真正的裸机代码,例如内核)编写的,并且您希望尽可能少的开销。
大多数嵌入式系统没有C ++编译器是有原因的-并不是人们不想要这样的编译器,而是将C ++代码挤在一个很小的空间中几乎是不可能的任务。