2011-04-06 14 views
10

¿Está previsto que el #include <file> se use solo para encabezados o es simplemente un "código de inyección mecánico" aquí que se puede usar en cualquier parte del código?#include anywhere

¿Qué sucede si lo uso en medio de una función cpp para simplemente "inyectar" código de una sola fuente? ¿Esto funcionará o los compiladores gritarán sobre esto?

+7

¿Por qué no intentas verte primero? – Nawaz

+0

.. no está cerca de un compilador en este momento ... – JasonGenX

Respuesta

15

Se es una mecánica inyectar el código aquí dispositivo. Puede incluir un archivo de texto que contenga el Fausto de Goethe si lo desea. Puede colocarlo en cualquier lugar, incluso en el medio de una función (¡por supuesto, #include necesita una línea nueva!).

Sin embargo, es una buena convención usar solo #include para archivos de encabezado. Puede haber razones por las que no me opondría a ello, por ejemplo, extraer el código generado por la máquina o fusionar todas las unidades de traducción en un solo archivo.

+9

Puede obtener el Fausto de Goethe [aquí] (http://www.gutenberg.org/ebooks/3023) como descarga gratuita;) – fredoverflow

+1

Puede ponerlo * casi * en cualquier sitio. '# include' debe ser un token preprocesador, y debe ser el primer token en una línea. Por lo tanto, 'a #include c' en una sola línea no funcionará. Tampoco '' include' dentro de una cadena literal. –

1

En caso de que funcione, es procesado por su preprocesador, su compilador ni siquiera lo verá.

6

Funcionará - más o menos su significado semántico es: Código de lugar en ese archivo aquí

EDIT: Para usos de abusar # include sólo puedo recomendar lo siguiente:

#include "/dev/console" 

Esto permite para todo: una sola línea que puede hacer todo, un error, es sólo una cuestión de compilación ...

0

#include y otras directivas de preprocesador como #define o #import, pueden aparecer en cualquier parte de la fuente, pero solo se aplicarán al código después de esa inclusión. Está destinado a incluir el código al que se hace referencia en el archivo fuente que lo llama. Esta página de MSDN lo explica bastante bien. http://msdn.microsoft.com/en-us/library/36k2cdd4(v=VS.71).aspx

5

Los compiladores no se quejarán, pero todos los que tengan que mantener el código lo harán.

0

include es manejado por el preprocesador y es un mecanismo para inyectar código. No hay restricciones sobre el archivo que se incluye o dónde se incluye este #include en su código (se pensó que debería estar en su propia línea). Siempre que el preprocesador pueda encontrar el archivo especificado, importará sus contenidos en el archivo actual.

Convencionalmente hace esto para los archivos de encabezado. He visto esto hecho con archivos cpp durante la creación de instancias de plantilla (con el #ifdef adecuado, por lo que no lo incluye varias veces, lo que causa un error de definición de símbolos múltiples).

Si tiene una constante larga, puede hacer esto para otros tipos de archivos también. (Aunque hay formas mejores de manejar constantes largas de cadena)

9

No solo funciona en ningún lado, sino que puede conducir a algunas técnicas interesantes. Aquí hay un ejemplo que genera una enumeración y una tabla de cadenas correspondiente que se garantiza que estarán sincronizadas.

Animals.h:

ANIMAL(Anteater) 
ANIMAL(Baboon) 
... 
ANIMAL(Zebra) 

AnimalLibrary.h:

#define ANIMAL(name) name, 

enum Animals { 
#include "Animals.h" 
     AnimalCount 
    }; 

#undef ANIMAL 

extern char * AnimalTable[AnimalCount]; 

AnimalLibrary.CPP:

#include "AnimalLibrary.h" 

#define ANIMAL(name) #name, 

char * AnimalTable[AnimalCount] = { 
#include "Animals.h" 
    }; 

main.cpp:

#include "AnimalLibrary.h" 

int main() 
{ 
    cout << AnimalTable[Baboon]; 
    return 0; 
} 

Asegúrese de no poner los habituales incluyen guardias en cualquier archivo que se incluirá varias veces!

Aunque estoy de acuerdo con William Pursell, esta técnica hará que la gente se rasque la cabeza.

+0

¡Eso es genial! Me tomó un poco de cabeza rascarse para descubrir qué estaba pasando, ¡pero sí! – murftown