【问题标题】:Making MSVC compiler GCC complient?使 MSVC 编译器 GCC 兼容?
【发布时间】:2010-09-07 23:59:39
【问题描述】:

有没有办法让 msvc 编译器像 gcc 一样严格? MSVC 让我做一些非常疯狂的事情,当我在 linux 中编译时会导致数百个错误。

谢谢

【问题讨论】:

  • @Milo - 我会密切关注这个问题。我目前正在将一个巨大的代码库从 MSVC 移植到 GNU 工具链,我感受到了你的痛苦。
  • 你能提供一些例子吗?我的印象始终是 MSVC 不允许很多完全有效的 C(至少 C99)的东西,因为它们不在 C++ 中,它本质上是一个 C++ 编译器,假装 C 是 C++ 的子集......
  • @R:由于他从 MSVC 转到 Linux,我不会被 GCC 不支持的 C99/C++03 特定代码打扰太多(提供最新版本的正在使用 GCC)。
  • @Milo:不同的编译器执行不同的事情。与它们一起编译并克服它。
  • 确实,我的印象是 MSVC 会警告任何不是有效 C++ 的 C,甚至可能是有效但不是 C++ 中“最佳实践”的东西。

标签: c++ c visual-studio gcc compiler-construction


【解决方案1】:

更好的问题是:MSVC、g++ 或任何其他编译器是否符合标准,如果符合,是否符合相同的标准版本?您不应该依赖一组常见的非标准行为。就个人而言,我负责在 g++ 4.1.x 和 VC7.1 上编译的超过 500KLOC 的 C++。两种编译器都可以互惠互利。

两种编译器都有语言或库扩展。 g++ 倾向于将库扩展放在单独的命名空间中更好。 VC,至少旧版本,不是那么好。两者都具有默认打开的语言扩展,或者可以通过编译器开关启用(或禁用)。您最好禁用所有语言扩展。

您可以在每个编译器上设置的警告级别越高越好 - 不要无缘无故忽视任何一个编译器的警告。

对于 Windows,默认情况下我使用以下选项:/W3 /wd4355 /wd4805 /wd4710。我想使用/W4,但是第 3 方库使这个级别无法忍受。 对于 g++,我使用-Wall -Wextra。我也想使用-Wold-style-cast,但我依赖的第三方库太多违反了这个。

每个编译器都会对不同的结构发出警告,或者对它们发出不同的警告。您最好注意两个编译器的输出,并找到它们之间产生零警告的代码子集,并尽可能设置高警告级别。

【讨论】:

  • +1。您可以设置几个选项会有所帮助,但归根结底,定期使用两个编译器构建项目是无可替代的。 5 年多来,我每天都在用 g++ 和 Visual Studio 构建相同的代码,除了 std::tr1 怪癖和typename 的使用等几件事之外,很少有东西可以在其中工作,但不是另一个。便携编写,你应该没有问题。
【解决方案2】:

要开始,我们需要您使用的版本(对于 MSVC)、您遇到的错误类型(编译时间、链接时间或运行时间)等等。

假设您使用的是相对较新的版本(MSVC 2008 SP1)并且受到编译器错误的困扰,我建议您采取以下措施:

  • 您的程序的入口点称为main 而不是_tmainWinMain
  • /W4:将警告视为错误
  • 删除所有以_ 开头的函数——它们是特定于实现的
  • 也没有 Win32 API
  • 没有特定于平台的线程
  • 检查char的签名是否相同
  • 这两种实现如何对待wchar_t
  • 没有安全异常处理或内联汇编魔法
  • 也没有 COM/MFC

【讨论】:

  • 我的问题不是 msvc 中的错误,问题是 msvc 在 gcc 更严格时让太多东西溜走了
  • @Milo:上面的列表表明了可能导致悲伤的原因。如果没有你身边的任何例子,你的问题就很难回答。
【解决方案3】:

/Za (Disable Language Extensions) 选项会禁用一些 Microsoft 特定的 keywordsextensions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-17
    • 2011-01-26
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多