使 MSVC 编译器兼容 GCC?

问题描述 投票:0回答:3

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

c++ c visual-studio gcc
3个回答
5
投票

更好的问题是: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
,但我依赖了太多违反此规定的第三方库。

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


2
投票

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

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

2
投票
/Za(禁用语言扩展)

选项可禁用许多 Microsoft 特定的关键字扩展

© www.soinside.com 2019 - 2024. All rights reserved.