2010-04-20 39 views

Respuesta

8

Si no le importa la portabilidad, la declaración __if_exists en VC++ satisface sus necesidades.

5

No hay tal cosa en la etapa de preprocesamiento, por lo que no hay macro.

Sin embargo, puede echar un vistazo a los rasgos de tipo is_classavailable in Boost o en C++ 0x que le permiten tomar decisiones en tiempo de compilación.

+2

Creo que el problema aquí es que 'Namespace :: MyClass' tiene que ser declarado como algo, incluso si no es una clase? – UncleBens

+0

Me gustaría incluir archivos, dependiendo del conocimiento si algunas clases ya están definidas. –

+0

@topright: ¿Pero por qué? Hay muchas maneras en que esto podría ser problemático si no tiene cuidado. –

9

No. Las directivas de preprocesamiento y las macros son evaluadas por el preprocesador, que completa sus tareas antes de que el código se analice como C++. El preprocesador no tiene conocimiento de clases o espacios de nombres.

5

Eso no es posible, pero podría usar su constante include guard para verificar que la clase haya sido incluida.

+0

Sí, de hecho. Pero no es la solución real. –

+0

¿A qué problema? – soulmerge

2

Me parece que sería mejor probar si aún se ha incluido el archivo de encabezado con la definición de clase que está buscando, en lugar de tratar de ver si la clase existe. Es muy fácil de comprobar esto si usted ha sido la aplicación de la norma de definir un símbolo para cada archivo de cabecera, como se muestra:

// myfile.h 

#ifndef _MYFILE_H_ 
#define _MYFILE_H_ 

// CODE 

#endif // _MYFILE_H_ 

Su mejor apuesta, sin embargo, es simplemente asegurarse de que sus archivos de cabecera están siendo incluidos en el orden correcto en primer lugar. La forma más fácil de hacerlo es tener un archivo de encabezado "general" que a su vez incluya todos los encabezados que necesitará en el orden correcto. Simplemente incluya eso en cada uno de los archivos fuente en su proyecto, y estará listo para comenzar. Esta no es necesariamente la mejor solución, pero es la más fácil.

Cuestiones relacionadas