【问题标题】:MSVC equivalent of gcc/clang's -Wall?MSVC 相当于 gcc/clang 的 -Wall?
【发布时间】:2018-07-12 02:11:18
【问题描述】:

我经常使用打开-Wall 标志的GCC(或clang)构建C(和C++)代码。现在我碰巧需要确保一个小型 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-Wall 开关?

编辑:如果我问的是-Wall -Wextra,那就是this existing question

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

【问题讨论】:

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


【解决方案1】:

请注意,MSVC 严重不符合标准 C 代码。如您所见,它会生成很多无用的警告,并且很少执行 C99 或 C11 规定。

典型的方法是定义 /Wall 并抑制项目属性表中的特定警告,这样您就不必在代码中到处使用#pragma 指令。当然,如果您是从命令行构建,那么您将无法使用 #pragmas

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

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

【讨论】:

  • 哦,您似乎刚刚回答了我的另一个问题的一部分……但是 - 什么是项目的“属性表”?请注意,我实际上并没有使用 MSVS IDE。
  • @einpoklum:查看我的编辑 -> 如果您使用的是 Visual Studio,则可以在项目中设置禁用警告。否则,您必须使用#pragma 方法。
  • @einpoklum 如果您使用 MSBuild 进行编译,属性表是项目文件的可注入块,您也可以将这些静音标志直接设置到项目文件本身中。否则,您需要将它们直接传递给编译器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多