Как предотвратить переопределение макросов

после работы в моем проекте, это предупреждение начинает появляться:

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'

Я уверен, что это вопрос о том, как разрешать файлы include, потому что ни один из этих файлов не принадлежит мне. Мой вопрос в том, что существует общий способ предотвратить или определить, какие файлы должны быть переупорядочены, чтобы избежать этого сообщения.

Ответ 1

Само сообщение об ошибке сообщает вам неправильный порядок. В нем говорится, что windef.h и wingdi.h переопределяют символы, которые были определены в glfw.h.

Поместите glfw.h после включения файлов Windows.

Ответ 2

Проблема в файле Game.cpp. Попробуйте включить windows.h перед glfw.h. В glfw.h есть защита, которая предотвратит это предупреждение:

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

Ответ 3

Microsoft обычно не разрабатывает заголовки для самостоятельной работы. Большинство заголовков, ориентированных на Windows, требуют, чтобы вы сначала включили <windows.h>. За исключением зависимости от этого заголовка Mother Of All, обычно нет конкретных зависимостей заголовков, поэтому, включив <windows.h>, сначала у вас не должно быть никаких проблем.

Ответ 4

К сожалению или к счастью, нет. Нет такого инструмента, который бы автоматизировал его. Вы должны прочитать код в этих файлах заголовков, выяснить, что происходит и предпринять соответствующие действия.

Самое большее, что вы можете сделать, это

Только ANSI C считает, что макроопределение переопределяет ошибку.

Ответ 5

Это может быть вызвано предварительными компиляциями Visual Studio для вас. Убедитесь, что все стандартные и микрософт заголовки включены до вашего. Не включайте заголовки Microsoft в любой из ваших файлов .h(похоже, что у вас есть windef.h и wingdi.h, включенные в ваш файл glfw.h). Убедитесь, что все ваши заголовки свободны от побочных эффектов. Затем проблема должна исчезнуть. Выяснить, что именно вызывает его, как правило, очень сложно.