2010-04-04 5 views
5

Existe-t-il un moyen de déclarer en avant le type HINSTANCE à partir de WinAPI sans inclure l'en-tête complet (et grand) windows.h?Avancer déclarer HINSTANCE et ses amis

Par exemple, si j'ai une classe RenderWindow qui possède un HINSTANCE mInstance, je vais devoir inclure dans windows.hRenderWindow.h. Donc, tout ce qui a besoin RenderWindow doit également inclure windows.h.

J'ai essayé d'inclure windef.h mais cela semble avoir besoin de certaines choses de windows.h. :-(Si je ne peux pas déclarer avant, est-il au moins un moyen portable d'utiliser quelque chose comme long mInstance dans RenderWindow au lieu de HINSTANCE?

+0

est-il réellement vous windows.h y compris causer de problèmes? –

+1

pas directement, mais je n'aime pas inclure parce que l'on doit parfois UNDEFINE '' min' et macros max' et je pense qu'il augmente le temps de compilation/lever les yeux, etc. – abenthy

+2

'#define NOMINMAX' avant d'inclure' '. –

Répondre

4

HINSTANCE est déclarée comme Windef.h typedef HINSTANCE __ * HINSTANCE;

Vous pouvez écrire dans vos têtes:

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

Vous obtiendrez des erreurs de compilation faisant référence à une HINSTANCE quand Windef.h ne sont pas inclus.

+2

C'est le hack que je cherchais, très intelligent! ('HINSTANCE__' semble être' struct' ici sur MSVC2005) – abenthy

+1

Ce n'est pas un hack, Windef.h est écrit pour l'autoriser :-) Déclarer une classe au lieu d'une struct garantit une erreur de compilation si Windef.h est inclus plus tard, qui signifie mauvaise conception de la structure du fichier. –

+1

Je vois, mais si je j'utilise la classe i obtenir une erreur de compilation si je les versions ultérieures incluent 'windows.h' dans mon dossier de mise en œuvre, dans lequel j'ai besoin' windows.h'. Est-il mauvais structure de fichier à utiliser vous typedef est suggéré dans un fichier d'en-tête et inclure 'windows.h' dans le fichier source correspondant? – abenthy

3

Vous pouvez déclarer void * et jeter les erreurs loin. Ce résultat est proche une bataille interminable que, tôt ou tard va se faire trébucher Utiliser les en-têtes pré-compilés de sorte que vous ne se soucient pas de la taille de 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 .

Avez-vous regardé la Pimpl idiom? Cela vous permet de cacher les membres privés. Un effet secondaire est que vous n'avez pas à inclure leurs en-têtes dans l'en-tête de votre classe.

+0

Yup, Pimpl est comment je fais d'habitude ça. – jalf

+0

Merci pour la suggestion. Je dois néanmoins dire que je préfère la solution d'Alain Rist. – abenthy

Questions connexes