2010-04-04 8 views
5

C'è un modo per inoltrare il tipo HINSTANCE da WinAPI senza includere l'intestazione completa (e grande) windows.h?Inoltra dichiarazione HINSTANCE e amici

Per esempio, se ho una classe RenderWindow che possiede un HINSTANCE mInstance, dovrò includere windows.h in RenderWindow.h. Quindi tutto ciò che ha bisogno di RenderWindow deve includere anche windows.h.

Ho provato incluso windef.h ma questo sembra aver bisogno di alcune cose da windows.h. :-(Se non posso avanti dichiararlo, c'è almeno un modo portatile per usare qualcosa come long mInstance in RenderWindow invece di HINSTANCE?

+0

Comprende windows.h che causa effettivamente problemi? –

+1

non direttamente, ma non mi piace includerlo perché uno deve talvolta indebolire i macro 'min' e' max' e penso che aumenti il ​​tempo di compilazione/cercare ecc. – abenthy

+2

'#define NOMINMAX' prima di includere' '. –

risposta

4

HINSTANCE è dichiarato in WinDef.h come typedef HINSTANCE __ * HINSTANCE;

Si può scrivere nelle intestazioni:

#ifndef _WINDEF_ 
class HINSTANCE__; // Forward or never 
typedef HINSTANCE__* HINSTANCE; 
#endif 

Otterrete errori di compilazione riferimento a un HINSTANCE quando Windef.h non è incluso.

+2

Questo è l'hack che stavo cercando, molto intelligente! ('HINSTANCE__' sembra essere' struct' qui su MSVC2005) – abenthy

+1

Non hack, Windef.h è scritto per permetterlo :-) Dichiarare una classe invece di una struct garantisce un errore del compilatore se Windef.h è incluso in seguito, che significa cattiva progettazione della struttura del file. –

+1

Vedo, ma se uso la classe ottengo un errore del compilatore se in seguito includo 'windows.h' nel mio file di implementazione, in cui ho bisogno di' windows.h'. È una cattiva struttura dei file da usare che ti viene suggerito typedef in un file di intestazione e includere 'windows.h' nel corrispondente file sorgente? – abenthy

3

Si potrebbe dichiararla void * e gettato gli errori di distanza. Questo è vicino al una battaglia senza fine, però, prima o poi, si otterrà sgambetto utilizzare le intestazioni precompilate in modo che non si preoccupano delle dimensioni di windows.h

stdafx.h:.

#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
3

For example, if I have a class RenderWindow which owns an HINSTANCE mInstance , i will have to include windows.h in RenderWindow.h . So everything that needs RenderWindow also has to include windows.h .

Hai guardato il Pimpl idiom? Questo ti permette di nascondere i membri privati. Un effetto collaterale è che non devi includere le intestazioni nell'intestazione della classe.

+0

Sì, Pimpl è come faccio di solito questo. – jalf

+0

Grazie per il suggerimento. Non ho mai meno da dire che preferisco la soluzione di Alain Rist. – abenthy

Problemi correlati