Ответ 1
Само сообщение об ошибке сообщает вам неправильный порядок. В нем говорится, что windef.h
и wingdi.h
переопределяют символы, которые были определены в glfw.h
.
Поместите glfw.h
после включения файлов Windows.
после работы в моем проекте, это предупреждение начинает появляться:
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, потому что ни один из этих файлов не принадлежит мне. Мой вопрос в том, что существует общий способ предотвратить или определить, какие файлы должны быть переупорядочены, чтобы избежать этого сообщения.
Само сообщение об ошибке сообщает вам неправильный порядок. В нем говорится, что windef.h
и wingdi.h
переопределяют символы, которые были определены в glfw.h
.
Поместите glfw.h
после включения файлов Windows.
Проблема в файле 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
Microsoft обычно не разрабатывает заголовки для самостоятельной работы. Большинство заголовков, ориентированных на Windows, требуют, чтобы вы сначала включили <windows.h>
. За исключением зависимости от этого заголовка Mother Of All, обычно нет конкретных зависимостей заголовков, поэтому, включив <windows.h>
, сначала у вас не должно быть никаких проблем.
К сожалению или к счастью, нет. Нет такого инструмента, который бы автоматизировал его. Вы должны прочитать код в этих файлах заголовков, выяснить, что происходит и предпринять соответствующие действия.
Самое большее, что вы можете сделать, это
ifdef
или if defined(...)
или if !defined(...)
конструкторы препроцессора.undef
.Только ANSI C считает, что макроопределение переопределяет ошибку.
Это может быть вызвано предварительными компиляциями Visual Studio для вас. Убедитесь, что все стандартные и микрософт заголовки включены до вашего. Не включайте заголовки Microsoft в любой из ваших файлов .h(похоже, что у вас есть windef.h и wingdi.h, включенные в ваш файл glfw.h). Убедитесь, что все ваши заголовки свободны от побочных эффектов. Затем проблема должна исчезнуть. Выяснить, что именно вызывает его, как правило, очень сложно.