【问题标题】:MSVS 2015 puts errno in stddef.h?MSVS 2015 将 errno 放入 stddef.h?
【发布时间】:2016-02-16 00:09:45
【问题描述】:

我有一个在多个平台上编译的项目,其中之一是 Visual C++。我注意到的是,我们经常破坏构建,因为开发人员使用了 errno 而没有包含 errno.h,但是因为它们在 Visual Studio 中工作,并且它们的源直接或间接包含 stddef.h,它并没有编译失败他们。

为什么在这个头文件中定义了errno?在我们的周期早期发现这个问题的好方法是什么? e.还在 Visual Studio 中?

【问题讨论】:

  • 在你的项目中,将光标放在errno 符号上,按 F12,VS 会显示符号的定义位置。这是一个开始。
  • 当 errno.h 被遗忘时,我正在尝试编译失败。
  • 其他标题可以包含<errno.,h>,这就是它起作用的原因。没有标准的跨平台方法来检查是否包含特定的标头,特别是因为其他标头可能包含该文件,因此它实际上会被包含。
  • 仅供参考:在我的 VS2013 上,errno 在 stdlib.h 中定义。此外,如果使用 win32 SDK,errno 是通过 stdlib.h 或其他包含但不在其他平台上的,我认为您无能为力。
  • 让一个平台编译所有其他平台都失败的代码是非常烦人的。我总是试图让它们尽可能相似,以避免代码到达 CI 服务器后的构建和修复周期。这是所有编译器都不相同的更令人震惊的情况之一。

标签: c visual-c++


【解决方案1】:

在我们的周期早期发现这个问题的好方法是什么? e.还在 Visual Studio 中?

除非您在两个不同的平台上同时开发,否则即使不是不可能,也很难发现此类问题。

您可以在 VS 项目的所有文件中搜索字符串“errno”,然后检查搜索是否也找到“errno.h”,但这仅对这个特定问题有用。标准库有许多其他函数/宏,您可能会间接看到这些函数/宏。使用相同的策略来确保所有函数/宏的正确头文件为#included 是不切实际的。

训练有素的开发人员和/或代码同行评审可能是您解决问题的最佳选择。

【讨论】:

  • 我认为你可能是对的。我希望这已经在编译时发生,但是另一个解决方案是扫描文件中的 errno 字符串并检查它们是否包含 errno.h。如果开发人员在提交之前运行测试,他们应该这样做(我们还没有通过提交规则强制执行),那么这应该可以保存他们。代码审查发生在我们流程的后期(在代码通过 CI 服务器之后,并且该错误已经花费了开发人员的时间),因此这是行不通的。
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2017-02-07
相关资源
最近更新 更多