Domanda

Difficile da venire con un titolo proprio per questo problema. Comunque ...

Al momento sto lavorando su un GUI per i miei giochi in SDL . Ho finito il disegno del software e stato il mio modo per iniziare a parte OpenGL di esso, quando un errore di strano si avvicinò. Ho incluso il "/ SDL_opengl.h SDL" intestazione e compilo. Si getta "Errore C2039: 'DrawTextW': non è un membro di 'GameLib :: FontHandler'", che è un errore abbastanza semplice, ma non ho nulla chiamato DrawTextW, solo FontHandler :: DrawText. Cerco DrawTextW e lo trovo in una chiamata #define nell'intestazione "Winuser.h"!

//WinUser.h
#define DrawText DrawTextW

A quanto pare va a sostituire il mio DrawText con DrawTextW! Come posso impedire che riversarsi in mio codice del genere?

E 'una cosa minore cambiare il nome di mia funzione, ma di denominazione conflitti come questo sembra piuttosto pericoloso e vorrei davvero sapere come evitarli tutti insieme.

Cheers!

È stato utile?

Soluzione

Hai un paio di opzioni, ognuno dei quali succhiare.

  • Aggiungi #undef DrawText nel proprio codice
  • Non includere windows.h. Se un altro libreria comprende per voi, non comprendono che, direttamente. Invece, includerlo in un file cpp separato, che possono poi esporre le proprie funzioni wrapper nella sua intestazione.
  • Rinomina il proprio DrawText.

Quando è possibile, di solito vado per l'opzione di mezzo. windows.h si comporta male in innumerevoli altri modi (ad esempio, in realtà non compilare a meno che non si attiva estensioni proprietarie C ++ di Microsoft), così ho semplicemente evito come la peste. Esso non viene inclusa nei miei file se posso farne a meno. Invece, scrivo un file cpp separato per contenerlo ed esporre la funzionalità di cui ho bisogno.

Inoltre, sentitevi liberi di presentarla come un bug e / o feedback su connect.microsoft.com. Windows.h è un colpo di testa penalmente mal progettato, e se la gente attirano l'attenzione di Microsoft di esso, c'è un (slim) possibilità che un giorno potrebbe risolvere il problema.

La buona notizia è che windows.h è il solo di intestazione che si comporta in questo male. Altre intestazioni in genere cercano di anteporre i loro macro con qualche nome specifico-biblioteca al fine di evitare conflitti di nomi, cercano di evitare la creazione di macro per i nomi più comuni, e cercano di evitare l'uso più macro del necessario.

Altri suggerimenti

Si tratta di un effetto collaterale della #includeing <windows.h>. Supponendo che non sta usando DrawText() Windows' ovunque nel programma, è perfettamente sicuro per #undef subito dopo:

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

Non c'è modo generale di evitare questo problema - una volta che si #include un file di intestazione utilizzando il preprocessore può ridefinire qualsiasi nome che vuole, e non c'è niente che tu possa fare al riguardo. È possibile #undef il nome, ma che assume si conosce il nome è stato #defined in primo luogo.

Proprio #undef i simboli che non si desidera. Ma fare in modo di includere windows.h e fare questo prima di includere SDL:

#include <windows.h>
#undef DrawText

#include <SDL/SDL_opengl.h>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top