用C++编译器编译C99文件



我在谷歌或这里都没有找到我要问的确切问题,所有的事情都在谈论想要从c代码调用c++,或者用c编译器编译的某个部分,或者用c++编译的另一个部分,然后链接在一起,以及我不想要的问题。

我想在我的所有C++应用程序中,用Visual Studio的C++编译器编译和链接C99文件,并能够在没有错误和问题的情况下调用C函数。不会涉及c链接器,也不会使用不同的编译器编译某些部分,稍后再链接在一起,或者任何技巧。标题来自C库(libcurl)和其他一些库,因为我想在应用程序中使用它们。我不想使用C++绑定,我想将C代码编译为C++。我能相信c代码在没有重大重构的情况下被编译为c++代码吗?与包含C++头相比,有什么不同之处?预期会出现什么不兼容?

理论上,C代码应该能够编译为C++代码。在某个时刻,Stroustrup博士指出,所有来自ANSI C版本的K&R用C++编译器编译,并且与用C编译器编译的代码具有相同的语义(这被解释为所有ANSI C代码都是有效的C++代码,显然不是这样,例如,因为许多C++关键字不是C中的保留标识符)。

然而,如果您想用C++编译器编译代码,C中的某些习惯用法将需要对C代码进行实质性的更改。一个典型的例子是需要将void*强制转换为C++中的正确类型,而这在C中是不需要的,而且似乎不赞成将malloc()的结果强制转换为正确的指针类型,尽管其效果是阻止了用C++编译器编译C代码(在我看来,这是一个好主意,例如,因为更严格的规则可能会导致发现C代码中的问题,即使生产版本是用C编译器编译的)。据我所知,还有一些微妙的语义差异,尽管现在我还不能很容易地指出其中的一个。也就是说,用C和C++编译器编译的同一代码可能定义了两种情况下不同的结果。

在实践中,我怀疑你是否可以用C++编译器简单地编译一个非平凡的C代码体,并得到一个与原始C代码行为相同的程序。如果您设想用C++编译的C程序附带了一组完整的测试用例,那么将代码移植到C++可能是可行的,但这将涉及更多的工作,而不仅仅是将文件从<name>.c重命名为<name>.cpp。我可以想象一个工具可以完成所需的转换(编译器将C源代码编译为C++源代码),但我不知道有这样的工具。我只知道相反的方向会产生完全不可读的代码(例如,Comeau C++使用C作为一种可移植汇编程序)。

如果您想使用visualstudio来实现这一点,那么这是不可能的。MSVC不支持C99。

C和C++是两种不同但密切相关的语言。C++是几乎C++的超集,但不完全是(特别是,C++有C缺乏的关键字)。

如果您的代码依赖于C99功能(即C99中的功能,而不是C90中的功能),那么您可能运气不好。微软的C编译器不支持C99(除了一些小功能;我认为它允许//注释),微软已经明确表示,这种支持不是优先事项。您可以修改代码,使其成为有效的C90,这取决于它使用的功能。

Microsoft Visual Studio同时支持编译C和C++(尽管它倾向于强调C++)。如果你能用MS C编译器编译你的C代码,我建议你这样做,而不是把它当作C++。C++具有一些特性,特别是extern "C",这些特性是专门为让您接口C和C++代码而设计的。C++FAQ-Lite在第32节中对此进行了讨论。

如果出于某种原因,您确实需要将C代码编译为C++,那么您可能只需对源代码进行一些小的更改即可完成。将源文件从foo.c重命名为foo.cpp,对其进行编译,并修复报告的所有错误。结果可能不会是好的C++,但你应该能够让它发挥作用。有一些结构是有效的C和具有不同语义的有效C++,但它们并不多,而且你不太可能遇到它们(但你一定要记住这一点)。

如果您想继续将代码维护为C++,我的建议是继续进行必要的更改,然后停止将其视为C代码

实际需要将相同的代码编译为C和C++的情况非常罕见。(例如,P.J.Plauger需要这样做,因为他提供了一些用于任何一种语言的库。)在大多数情况下,C++的extern "C"和其他功能都足够好,可以让你合理地干净地混合这两种语言。

最新更新