2010-04-04 20 views
5

¿Hay alguna manera de reenviar-declarar el tipo HINSTANCE del WinAPI sin incluir el encabezado completo (y grande) windows.h?Reenviar declarar HINSTANCE y amigos

Por ejemplo, si tengo una clase que posee un RenderWindowHINSTANCE mInstance, voy a tener que incluir en windows.hRenderWindow.h. Entonces, todo lo que necesite RenderWindow también debe incluir windows.h.

Intenté incluir windef.h pero esto parece necesitar algunas cosas de windows.h. :-(Si no puedo declarar hacia adelante, ¿hay al menos una forma portátil para usar algo como long mInstance en RenderWindow en lugar de HINSTANCE?

+0

¿Está causando realmente algún problema con windows.h? –

+1

no directamente, pero no me gusta incluirlo porque a veces hay que redefinir las macros 'mín' y' máx' y creo que aumenta el tiempo de compilación/búsqueda, etc. – abenthy

+2

'#define NOMINMAX' antes de incluir' '. –

Respuesta

4

HINSTANCE se declara en WinDef.h como typedef HINSTANCE __ * HINSTANCE;

Usted puede escribir en sus cabeceras:

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

Usted recibirá errores de compilación que hacen referencia a un HINSTANCE cuando WinDef.h no está incluido.

+2

¡Ese es el truco que estaba buscando, muy inteligente! ('HINSTANCE__' parece ser' struct' aquí en MSVC2005) – abenthy

+1

No es un truco, Windef.h está escrito para permitirlo :-) Declarar una clase en lugar de una estructura garantiza un error de compilación si se incluye Windef.h más tarde, que significa mal diseño de estructura de archivos. –

+1

Veo, pero si uso clase obtengo un error de compilación si más adelante incluyo 'windows.h' en mi archivo de implementación, en el cual necesito' windows.h'. ¿Es mala estructura de archivos utilizar, se sugiere typedef en un archivo de cabecera e incluir 'windows.h' en el archivo fuente correspondiente? – abenthy

3

Se podría declararlo desierto * y emitir los errores de distancia. Esto está cerca una batalla sin fin, sin embargo, tarde o temprano, que obtendrá un tropiezo utilizar encabezados precompilados para que no se preocupan por el tamaño de windows.h

stdafx.hy:.

#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 .

¿Has mirado el Pimpl idiom? Esto le permite ocultar miembros privados. Un efecto secundario es que no tiene que incluir sus encabezados en el encabezado de su clase.

+0

Sí, Pimpl es la forma en que generalmente hago esto. – jalf

+0

Gracias por la sugerencia. Sin embargo, tengo que decir que prefiero la solución de Alain Rist. – abenthy

Cuestiones relacionadas