di altra libreria #define denominazione conflitto
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!
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 #include
ing <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>