如何防止宏重新定义

Kil*_*zor 15 c++ macros visual-studio

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

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'
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*som 21

错误消息本身告诉您错误的订单.它说windef.h并且wingdi.h正在重新定义在中定义的符号glfw.h.

放入glfw.hWindows包含文件.

  • 这是一个非常好的答案,因为它是解决这些类型问题的一般解决方案或至少是一个很好的起点. (2认同)

Che*_*Alf 8

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

  • 但也有例外.例如,必须首先包含winsock2.h以防止从windows.h中包含winsock.h (2认同)

tib*_*bur 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
Run Code Online (Sandbox Code Playgroud)