使用纯C与C编译器和C++编译器的"C部分"有什么区别?

jok*_*oon 7 c c++

我不确定C中的编程真正意味着什么: - 使用C编译器在纯C中编程或使用C++编译器在C中编程.

除了C的C语法和C语言的C++语法之间的差异之外,我可以肯定地说,在性能方面,两个可执行文件之间绝对存在差异(或者极少数情况下)吗?

我正在考虑这个问题,因为在游戏编程中,每个渲染部分,游戏对象部分和游戏脚本部分都可以编程完全不同的语言,以获得执行速度和易于开发之间的最佳折衷,在每一部分.

部件之间的这种分离对我来说很重要,例如,我想制作一个多功能的3D冒险引擎,社区可以制作自己的游戏玩法而不必乱用引擎.它只能制作具有单个角色和几个敌人的游戏,因此将涵盖不同的游戏类型:黑客和斜线,渗透,角色扮演,平台等.

我应该把这两段放在gamedev.stackexchange中,但第一部分只是关于语言......

alt*_*ive 30

有很多次要的挑剔.让我觉得最明显的是,在C++中,你必须抛出返回值malloc.结构也是在C++中自动进行类型化的.

始终将C编译器用于C代码,而不是C++.C++与C不完全兼容.

其他几个:

  • 在C中,声明void func();声明一个没有指定其参数是什么的函数,而在C++中,void func();它等同于C void func(void)',不带参数;
  • C++中需要原型,而它通常只是C中的警告;
  • 字符常量的类型(如'a')int在C和charC++中;
  • 字符串文字的类型是char []C和const char []C++;
  • C中的一些合法变量名称class是C++中的保留关键字.

对于那些不相信我并且正在贬低的人,请查看以下C代码:

#include <stdlib.h>

int main(int argc, char **argv) {
    int *i = malloc(sizeof(int));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译gcc很好,但编译下g++给出以下错误:

test.c: In function `int main(int, char**)':
test.c:4: error: invalid conversion from `void*' to `int*'
Run Code Online (Sandbox Code Playgroud)

  • @ 0A0D:你抨击他,因为他投了一些不错的东西.C++绝对不能向后兼容C语言.有效的C代码是C++中的错误. (9认同)
  • 如果使用C++编译器,也不能使用C++引入的任何新关键字(例如`new`)作为变量或函数名称. (6认同)
  • @ 0A0D如果您认为它不准确,请尝试编译`gcc`和`g ++`下的`malloc`示例.C++需要强制转换,C则不需要. (6认同)
  • @ 0A0D C++在`int*foo = malloc(sizeof(int));`上给出了一个错误,因为你必须用C++编译它.这是一个不公平的downvote - 请在抨击人们之前查阅信息. (5认同)
  • @ 0A0D:我认为可能更好的是,你承认你对后向兼容性的评论不正确,而不是对"大满贯"的确切含义进行狡辩. (5认同)
  • @ 0A0D:我担心你错了.您只需要咨询一些突出且易于定位的资源,以确定C++不是C的严格超集,并且不完全向后兼容.当然有一本书_The C++ Programming Language本身,有几个FAQ,比如Bjarne Stroustrup本人的那些:http://www2.research.att.com/~bs/bs_faq.html#C-is-subset和一般彻底的Parashift C++常见问题解答:http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.11 - 我相信你可以通过一些谷歌搜索找到其他人. (4认同)
  • @AOD:更糟糕的是,C代码在C++中编译并具有不同的含义(因此没有向后兼容性(除非你坚持C的严格子集)).最明显的是sizeof('a')为C/C++产生不同的结果 (3认同)
  • @ 0A0D - 什么?我刚刚证明你贬低我的理由不正确.删除downvote. (2认同)

pae*_*bal 8

注意:C和C++语法之间的差异已经在其他帖子中描述了......但是,有些事情让我感到困扰,足以提示以下答案:

如果我理解正确,你想在程序中有两个独立的部分,一个在C中,一个在C++中.一个人认为应该非常快,而另一个可能会更慢.

在当前的情况下(比较C和C++性能),如果使用C和C++编译器编译相同的C代码,则没有明显的区别......

当然,永远不要低估程序员的技能对于程序的执行是否重要,无论语言如何.

选择C编译器

优点

  • 如果你很幸运(使用最新的gcc或其他),你将能够使用C99新功能(请注意,C++已经提供了C99的大部分有用部分,无论是语言本机还是标准库).
  • 你不会错误地使用C++功能,因此,可以安全地打赌你不会在K&R之外出现意外

缺点

  • 您将无法使用C++功能
  • 并非每个C编译器都支持C99(例如,Visual C++正在努力实现新的C++ 0x标准,但实现C99的工作很少)...因此,如果您使用,可能会遇到C89代码,或者针对错误的编译器.

选择C++编译器

优点

  • 您将可以访问C和C++库
  • 你将能够使用STL和Boost
  • 您将能够编写模板化代码(即比void *同类代码更快,更安全).
  • 您将能够用C编写所有代码,不包括一些小细节(C++不允许隐式转换void *等).事实上,上面的"小细节"被认为是危险的,这就是它们在C++编译器上产生错误或警告的原因.

缺点

  • 如果要使用C命名约定导出函数,则必须使用说明extern "c"符.
  • 您将无法隐式地进行转换void *(请注意,这不应该在C++中经常发生,甚至根本不会发生,因此与潜在的转换错误相比,这是一个可以忽略不计的问题)
  • 如果你编写C++代码,那么你需要学习的东西比简单的C要好得多(RAII,构造函数/析构函数,异常等).

生成C/C++代码

通过C/C++,我的意思是C和C++编译器都能正确理解的代码.虽然您选择的语言可能会有所不同,但那些兼容的C/C++标题将是相同的(即使您使用C++编写代码并为代码的C++用户提供额外的C++标头)

为了使您的C代码与其他人的C++代码兼容:

  • 用一个extern "C"包装的说明符装饰你的函数声明#ifdef __cpluplus.这将确保C++编译器知道这些函数被导出为C函数
  • 如果您使用它们,请不要让C++编译器看到C99功能.任何C++编译器都不会支持其中一些功能.事实上,一些主要的编译器甚至不支持C99用于他们的C编译器(参见http://en.wikipedia.org/wiki/C99#Implementations)
  • 避免使用C++的关键字,或者至少,不要让C++编译器看到他们(即出口调用的函数namespaceclass或者template是一个坏主意)

为了使您的C++代码与其他C代码兼容:

  • 提供包装C++类和函数的替代头文件和函数.不要通过删除类等来惩罚C++人员,因为你想要保持与C的兼容,但另一方面,确保C人员可以合理地访问你的库,而无需转移到C++编译器.
  • 在为C人写的标题中,用一个extern "C"包装的说明符来装饰你的函数声明#ifdef __cpluplus.这将确保C++编译器知道这些函数将作为C函数导出

附加信息

我发现以下页面非常有趣,因为它列出了C(包括C99)和C++之间的差异:

http://david.tribble.com/text/cdiffs.htm

至于C++中缺少的C99功能,你可以阅读我对问题的答案c可以做什么而不是c ++?:我描述了C++功能,可以轻松替换那些C99功能.

后记

无论如何,如果C++被认为F-35而言足够快且足够强大,那么它应该足够你了.

由于程序员的可用性,F-35的大部分软件都是用C和C++编写的; Ada83代码也可以从F-22中重复使用.

来源:维基百科:https://en.wikipedia.org/wiki/Lockheed_Martin_F-35_Lightning_II

所以,如果你需要选择,那么选择你的语言是因为你喜欢它,或者因为一个是另一个没有的.但不是因为假设的性能差异.

  • 为什么将“您将能够使用STL和Boost”列为专业人士?我讨厌他们两个。我讨厌C ++模板,并且仍然仅将C ++用作具有类和异常的C。 (2认同)