【问题标题】:Fix macro redefinition in C++修复 C++ 中的宏重新定义
【发布时间】:2014-10-01 19:53:20
【问题描述】:

因为intsafe.hstdint.h 都定义了INT8_MIN。因此 VS2010 会生成一个警告:

    1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h(72): warning C4005: 'INT8_MIN' : macro redefinition
1>          C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\intsafe.h(144) : see previous definition of 'INT8_MIN'

有没有办法在 VS2010 中修复该警告。

【问题讨论】:

  • 不要同时包含两个文件,或者在包含第二个文件之前先#undef。你会遇到的问题是,如果他们没有以同样的方式定义它。
  • 这是两个文件中的定义:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h(76):#define INT8_MAX 0x7f C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\intsafe.h(167):#define INT8_MAX 127i8
  • 我在构建 C++ ATL COM dll 时收到了类似的警告,在从 stdafx.h 文件中删除 #include <afxframewndex.h> #include <afxmdiframewndex.h> 包含语句后,我没有收到任何此类警告

标签: c++ visual-studio-2010 macros visual-studio-macros


【解决方案1】:

显然这是 VS2010 中的一个错误。一般来说,你可以避免它,但在 MFC 应用程序中,基本上不可能在任何其他代码中包含 stdint.h 而不点击它。

我只是在抱怨的文件顶部做了这个:

#pragma warning (push)
#pragma warning (disable : 4005)
#include <intsafe.h>
#include <stdint.h>
#pragma warning (pop)

可以说,它可以让这些标题“不碍事”,让你继续你的一天。

【讨论】:

  • 重复的定义是等价的,但不完全相同会导致警告。忽略警告是安全的。我将它放在有问题的项目的 stdafx.h 文件中以抑制警告。
【解决方案2】:

为了使消息消失,您可以添加该行

#pragma warning (disable : 4005)

在您的第一个 #include 声明之前

但这并不意味着您不应该注意警告。看看你是否可以不使用这两个头文件之一,如果不能,请非常确定你的程序使用的是哪个定义。

【讨论】:

  • 而#pragma 的放置位置是在stdint.h 或主标题中
  • 在你有#include "stdint.h"或'#include "instate.h"`之前把它放在你的程序中。编译指示应该在第一个#includes之前。
  • 另外,不要忘记使用 push/pop pragma,这样您就可以完全按照自己的意愿处理警告异常(请参阅:cpphints.com/hints/22
猜你喜欢
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多