如何防止宏重新定义

时间:2010-10-13 20:39:43

标签: c++ visual-studio macros

在我的项目上工作了一段时间后,这个警告开始出现:

2>Game.cpp
2>c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(126) : warning C4005: 'APIENTRY' : redefinición de macro
2>        c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(72) : vea la definición anterior de 'APIENTRY'
2>c:\program files\microsoft sdks\windows\v6.0a\include\wingdi.h(23) : warning C4005: 'WINGDIAPI' : redefinición de macro
2>        c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(88) : vea la definición anterior de 'WINGDIAPI'

我确定这是要解决的包含文件顺序的问题,因为这些文件都不是我的。我的问题是,是否存在一种通用的方法来防止这种情况或找到必须重新排序的文件以避免此消息。

5 个答案:

答案 0 :(得分:21)

错误消息本身告诉您错误的订单。它表示windef.hwingdi.h正在重新定义glfw.h中定义的符号。

glfw.h放在Windows包含文件之后。

答案 1 :(得分:8)

Microsoft通常不会将标头设计为独立的。大多数面向Windows的标头要求您首先包含<windows.h>。除了依赖于所有标题之母之外,通常没有特定的标题依赖关系,所以首先包括<windows.h>你不应该有任何问题。

答案 2 :(得分:7)

问题出在文件 Game.cpp 中。尝试在 glfw.h 之前包含 windows.h glfw.h 中有一个警卫会阻止该警告:

#ifndef APIENTRY
 #ifdef _WIN32
  #define APIENTRY __stdcall
 #else
  #define APIENTRY
 #endif
 #define GL_APIENTRY_DEFINED
#endif // APIENTRY

答案 3 :(得分:2)

不幸的是,幸运的是,没有。没有这样的工具可以自动化它。您必须阅读这些头文件中的代码,找出正在发生的事情并采取适当的措施。

你能做的最多就是

  1. 检查是否使用ifdefif defined(...) or if !defined(...)预处理器结构定义了宏。
  2. 使用undef取消定义宏。
  3. 只有ANSI C认为宏重新定义是错误。

答案 4 :(得分:1)

这可能是由Visual Studio预编译标头引起的。确保所有标准和微软标头都包含在您的标准之前。不要在任何.h文件中包含microsoft头文件(看起来你的glfw.h中有windef.h和wingdi.h)。确保所有标题都没有副作用。问题应该消失。确切地确定导致它的原因通常非常困难。