MSVC相当于gcc / clang的-Wall?

时间:2018-02-01 17:00:36

标签: c visual-c++ compiler-warnings

我经常构建C(和C ++)代码,使用GCC(或clang)并打开-Wall标志。现在我碰巧需要确保一个小的C项目,它在带有这个标志的Linux上构建得很好,也建立在带有MSVC的Windows上。

但是,如果我使用-Wall运行MSVC,我会收到许多警告,我发现这些警告相当虚假,例如:

  • warning C4255: 'some_func': no function prototype given: converting '()' to '(void)'
  • `警告C4820:'some_struct':在数据成员'some_member'之后添加'4'字节填充

等等。现在,我意识到我可以使用#pragma warning(disable:1234)来抑制个别警告;但仍然:C代码与MS Visual C ++的编译器警告开关的常见,合理组合,大致相当于gcc / clang的{​​{1}}开关?

修改:如果我问的是-Wall,那就是this existing question

注意:我正在使用MSVC 2015以防万一 - 但不是IDE,只是编译器。

1 个答案:

答案 0 :(得分:3)

请注意,MSVC严重违反标准C代码。正如您所看到的,它会产生相当多的无用警告,并且很少执行C99或C11规定。

典型的方法是定义/ Wall并在项目的属性表中禁止特定警告,这样您就不必在代码中添加#pragma指令。当然,如果您是从命令行构建的,那么您仍然坚持使用#pragmas

此外,定义CRT_SECURE_NO_WARNINGS以消除所有支持使用MS批准的大多数字符串函数版本的警告通常很有用。这自然会假设您实际上并未使用这些版本。

关于C4255警告 - 根据标准,这实际上是必需的,因为不再支持空参数列表。这里的要点是确保当你压制所有的绒毛时,你实际上并没有压制有用的东西。