2010-09-07 216 views
2

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

感谢

+0

@Milo - 我会密切关注这个问题。我目前正在将一个巨大的代码从MSVC移植到GNU工具链上,我感觉你很痛苦。 – 2010-09-08 00:01:39

+0

你能提供一些例子吗?我的印象是,MSVC总是禁止许多完全有效的C语言(至少C99),因为它们不在C++中,它本质上是一个假装C是C++子集的C++编译器... – 2010-09-08 00:09:11

+0

@R:既然他是从MSVC到Linux我不会被C99/C++ 03特定的代码困扰太多,并且GCC不支持这些代码(假设使用了最新版本的GCC)。 – dirkgently 2010-09-08 00:11:46

回答

2

要开始我们就需要你在(为MSVC)的版本,你打什么样的错误(编译时,链接时或运行时)等。

假设你是一个相对较新的版本(MSVC 2008 SP1)和编译器错误被窃听,我建议如下:

  • 你的程序的入口点main而不是_tmainWinMain
  • /W4:警告视为错误
  • 删除所有以_开头的功能 - 它们是具体的实施
  • 没有的Win32 API要么
  • 没有特定于平台的线程
  • 检查,如果你有char
  • 相同的符号性如何做这两种实现治疗wchar_t
  • 没有安全的异常处理或内联汇编魔法
  • 没有COM/MFC要么
+0

我的问题不是msvc中的错误,问题是msvc让太多的东西滑动,而gcc更严格 – jmasterx 2010-09-08 00:19:40

+0

@Milo:上面的列表是可能导致悲伤的指示。没有任何来自你身边的例子,你的问题就很难回答。 – dirkgently 2010-09-08 00:23:56

5

一个更好的问题是:MSVC,g ++或任何其他编译器标准兼容,如果是,则是相同的标准版本?你不应该依赖于一套常见的非标准行为。就我个人而言,我负责在g ++ 4.1.x和VC7.1上编译超过500KLOC的C++。这两种编译器都可以有很多的支持。

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

您可以设置的每个编译器的警告级别越高越好 - 并且不要忽视来自任一编译器的警告,而无需理由。

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

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

+0

+1。您可以设置几个选项,这些选项将有所帮助,但是在一天结束时,无法用两个编译器定期构建项目。我一直在使用g ++和Visual Studio每天构建相同的代码5年以上,除了std :: tr1怪癖和使用'typename'之类的东西之外,还有很少的东西可以在其中工作,另一个。便携式书写,你不应该有问题。 – 2010-09-09 08:22:28