Pregunta

Difícil encontrar un título adecuado para este problema.De todos modos...

Actualmente estoy trabajando en un GUI para mi los juegos en SDL.He terminado el software de dibujo y estaba en mi camino a iniciar el OpenGL parte de ello cuando un error extraño ocurrió.He incluido el "SDL/SDL_opengl.h" encabezado y compilar.Se tira "error C2039:'DrawTextW' :no es un miembro de 'GameLib::FontHandler'", el cual es bastante simple error, pero no tengo nada de llamada DrawTextW, sólo FontHandler::DrawText.Busco DrawTextW y encontrar en un #define llamada en el encabezado "WinUser.h"!

//WinUser.h
#define DrawText DrawTextW

Al parecer se reemplaza mi DrawText con DrawTextW!¿Cómo puedo evitar que se derrame en mi código como ese?

Es una cosa de menor importancia cambiar mi propia función del nombre, pero el nombramiento de los conflictos como este parecen bastante peligroso y realmente me gustaría saber cómo evitar todos ellos juntos.

Saludos!

¿Fue útil?

Solución

Usted tiene un par de opciones, todas las cuales chupar.

  • Añadir #undef DrawText en su propio código
  • No incluya windows.h. Si otra biblioteca incluye por usted, que no incluyen directamente. En su lugar, incluirlo en un archivo .cpp separada, que puede exponer a sus propias funciones de contenedor en su cabecera.
  • Cambiar el nombre de su propio DrawText.

Cuando sea posible, por lo general voy por la opción de media. windows.h se comporta mal en un sinnúmero de otras maneras (por ejemplo, que en realidad no compila a menos que habilite propietarias extensiones de C ++ de Microsoft), por lo que sólo tiene que evitar como la peste. No consigue incluido en mis archivos si puedo evitarlo. En su lugar, escribo un archivo .cpp separada para contener y exponer la funcionalidad que necesito.

Además, no dude para enviarlo como un error y / o comentarios sobre connect.microsoft.com. Windows.h es una cabecera penalmente mal diseñado, y si la gente llamar la atención de Microsoft a ella, hay una posibilidad (delgada) que algún día podrían solucionarlo.

La buena noticia es que se windows.h la Sólo cabecera que comporta este mal. Otras cabeceras generalmente tratan de anteponer sus macros con algún nombre-biblioteca específica para evitar conflictos de nombres, que tratan de evitar la creación de macros para los nombres comunes, y tratan de evitar el uso de macros más de lo necesario.

Otros consejos

Es un efecto secundario desafortunado de #include <windows.h>ing. Suponiendo que usted no está realmente utilizando DrawText() de Windows' en cualquier parte del programa, que es perfectamente seguro para #undef inmediatamente después de:

// wherever you #include <windows.h>, or any other windows header
#include <windows.h>
#undef DrawText

No hay forma general de evitar este problema - una vez que #Include un archivo de cabecera utilizando el preprocesador puede redefinir cualquier nombre que le gusta, y no hay nada que pueda hacer al respecto. Puede #undef el nombre, pero que se supone que conoce el nombre fue #defined en el primer lugar.

Sólo #undef los símbolos que no desea. Pero asegúrese de que incluye windows.h y hace esto antes de incluir SDL:

#include <windows.h>
#undef DrawText

#include <SDL/SDL_opengl.h>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top