【问题标题】:Compiling C99 files with C++ compiler使用 C++ 编译器编译 C99 文件
【发布时间】:2014-01-14 18:10:50
【问题描述】:

在谷歌或这里都没有找到我要问的确切问题,所有内容都在谈论想要从 c 代码调用 c++ 或使用 c 编译器编译的某些部分和使用 c++ 编译的其他部分,然后再链接在一起以及问题源于我想要的。

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

【问题讨论】:

  • Visual Studio 包含一个 C 编译器(尽管它不完全支持 C99)。为什么要用 C++ 编译器编译 C 代码?
  • 这些库是我想包含在我的 C++ 应用程序中的 C 代码。
  • 这就是extern "C" 的用途。如果它使用了 MSVS 不支持的 C99 特性,那么除非你重新编译它,否则你就很不走运了。如果没有,大部分 C 代码只需稍作调整即可编译为 C++;尝试将其编译为 C++ 并修复任何报告的错误。 (有一些东西是具有不同语义的有效 C 和有效 C++,但不是很多。)如果您想将代码从 C 转换为 C++,请执行此操作并停止将其视为 C。如果您想保留它在 C 中,将其编译为 C。
  • 文件位于 .c 和 .h 中,因此它们可以并且将被重新编译,否则我无法理解您的确切意思。

标签: c++ c visual-studio compilation


【解决方案1】:

理论上,C 代码应该可以编译为 C++ 代码。在某些时候 Dr.Stroustrup 指出,来自 K&R 的 ANSI C 版本的所有代码都使用 C++ 编译器编译,并且具有与使用 C 编译器编译的代码相同的语义(这被解释为 all ANSI C 代码将是有效的 C++ 代码,但显然并非如此,例如,因为许多 C++ 关键字不是 C 中的保留标识符)。

但是,如果您想使用 C++ 编译器编译代码,C 中的某些惯用语将需要对 C 代码进行大量更改。一个典型的例子是需要在 C++ 中将 void* 转换为正确的类型,而这在 C 中是不需要的,并且似乎在将结果从 malloc() 转换为正确的指针类型时会皱眉,尽管效果是它可以防止使用 C++ 编译器编译的 C 代码(我认为这是一个很好的想法,例如,因为更严格的规则可能会导致发现 C 代码中的问题,即使生产版本是使用 C 编译器编译的)。据我所知,还有一些细微的语义差异,尽管现在我不能轻易指出其中之一。也就是说,用 C 和 C++ 编译器编译的相同代码可能在两种情况下定义了不同的结果。

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

【讨论】:

    【解决方案2】:

    如果您想使用 Visual Studio 执行此操作,那么这是不可能的。 MSVC 不支持 C99。

    【讨论】:

    • 没有任何版本的 Visual Studio 完全支持 C99。较早的版本可能支持更多的功能,但微软已经明确表示他们没有完全支持 C99 的计划。
    • @KeithThompson;删除了。
    【解决方案3】:

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

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

    Microsoft Visual Studio 支持编译 C 和 C++(尽管它倾向于强调 C++)。如果您可以使用 MS C 编译器编译您的 C 代码,我建议您这样做,而不是将其视为 C++。 C++ 有一些特性,尤其是extern "C",专门设计用于让您连接 C 和 C++ 代码。 C++ FAQ Litesection 32 中讨论了这个问题。

    如果您出于某种原因确实需要将 C 代码编译为 C++,您可以通过一些小的源代码更改来实现。将源文件从foo.c 重命名为foo.cpp,对其进行编译,并修复报告的所有错误。结果可能不是 C++,但你应该能够让它工作。有一些构造是有效的 C 和具有不同语义的有效 C++,但它们并不多,而且您不太可能遇到它们(但您绝对应该牢记这一点)。

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

    实际需要将相同的代码同时编译为 C 和 C++ 的情况很少见。 (例如,P.J. Plauger 需要这样做,因为他提供了一些旨在用于任何一种语言的库。)在大多数情况下,C++ 的extern "C" 和其他特性足以让您合理干净地混合两种语言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多