2010-10-13 22 views
10

después de trabajar algún tiempo en mi proyecto, esta advertencia comienzan a aparecer:Cómo prevenir la redefinición macro

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' 

Estoy seguro de que es un asunto del orden de los archivos de inclusión de resolver, ya que ninguno de estos archivos son míos Mi pregunta es si hay una manera genérica de evitar o encontrar qué archivos deben reordenarse para evitar este mensaje.

Respuesta

17

El mensaje de error en sí mismo que está diciendo el orden incorrecto. Dice que windef.h y wingdi.h están redefiniendo símbolos que se definieron en glfw.h.

Ponga glfw.h después de que Windows incluya archivos.

+2

Esa es una muy buena respuesta, porque es una solución general o al menos un buen punto de partida para resolver este tipo de problemas. – Killrazor

7

El problema está en el archivo Game.cpp. Intente incluir windows.h antes de glfw.h. Hay un guardia en glfw.h y evitará la advertencia:

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

Desafortunadamente o no, no. No hay tal herramienta que lo automatice. Tienes que ir a leer el código en esos archivos de encabezado, descubrir qué está pasando y tomar las medidas adecuadas.

Lo máximo que puede hacer es

  1. Comprobar si la macro se define utilizando ifdef o if defined(...) or if !defined(...) construcciones del preprocesador.
  2. Define la macro con undef. Sólo

ANSI C considera redefinición macro un error.

+1

Lea el capítulo "sustitución macro" en los documentos estándar C99 y C11. Ambos dicen que la macro no debe redefinirse a menos que las listas de reemplazo sean idénticas. Así que creo que estás equivocado porque no se considera un error. La verdad es que la mayoría de los __compiladores__ generan advertencia solamente, pero esta es su forma de lidiar con el código no compilatorio. –

7

En general, Microsoft no diseña encabezados para ser autónomos. La mayoría de los encabezados orientados a Windows requieren que haya incluido por primera vez <windows.h>. A excepción de la dependencia de ese Mother Of All Headers, por lo general no hay dependencias de encabezado específicas por lo que al incluir <windows.h> primero no debería tener ningún problema.

+1

Hay excepciones, sin embargo. Por ejemplo, winsock2.h debe incluirse primero para evitar la inclusión de winsock.h hecho desde windows.h –

+0

@ PawełStankowski: ¡Gracias! Eso me pareció que debe haber alguna macro que controle los includes, así que preparé un Visual Studio (por casualidad en 2012), que tiene una buena característica de ir a encabezado. Oh, solo veo dos posibilidades: usar el protector de inclusión interno '_WINSOCKAPI_', que está sucio, o usar' WIN32_LEAN_AND_MEAN'.Este último es una práctica casi estándar, así que debería ser bueno. –

+0

Está bien como solución alternativa, si no necesita ninguna funcionalidad detrás de lean & mean define o si está seguro de que su código no se usará desde un proyecto que requiera funcionalidad de windows.h y esté oculto por WIN32_LEAN_AND_MEAN define. –

1

Esto puede deberse a que Visual Studio compila encabezados por usted. Asegúrese de que todos los encabezados estándar y microsoft estén incluidos antes que los suyos. No incluyas encabezados de microsoft en ninguno de tus archivos .h (parece que tienes windef.hy wingdi.h incluidos en tu glfw.h). Asegúrese de que todos sus encabezados sean libres de efectos secundarios. El problema debería desaparecer. Averiguar exactamente qué es lo que causa es generalmente muy difícil.

+0

FYI, glfw.h es una API para OpenGL. _Nadie_ puede cambiar las API. :PAG – Tqn

Cuestiones relacionadas