Puede usar en #include
cualquier lugar de un archivo, no solo en el ámbito global, como dentro de una función (y varias veces si es necesario). Seguro, feo y no de buen estilo, pero posible y ocasionalmente sensato (dependiendo del archivo que incluyas). Si #include
solo fuera algo de una sola vez, entonces eso no funcionaría. #include
simplemente hace una sustitución de texto tonta (cortar y pegar) después de todo, y no todo lo que incluye tiene que ser un archivo de encabezado. Puede, por ejemplo, #include
un archivo que contenga datos generados automáticamente que contengan los datos sin procesar para inicializar un std::vector
. Me gusta
std::vector<int> data = {
#include "my_generated_data.txt"
}
Y que "my_generated_data.txt" sea algo generado por el sistema de compilación durante la compilación.
O tal vez soy vago / tonto / estúpido y pongo esto en un archivo ( ejemplo muy elaborado):
const noexcept;
y luego lo hago
class foo {
void f1()
#include "stupid.file"
int f2(int)
#include "stupid.file"
};
Otro ejemplo, un poco menos elaborado, sería un archivo de origen en el que muchas funciones necesitan usar una gran cantidad de tipos en un espacio de nombres, pero no quiere decir simplemente using namespace foo;
globalmente, ya que eso contaminaría el espacio de nombres global con muchas otras cosas. no quieres. Así que crea un archivo "foo" que contiene
using std::vector;
using std::array;
using std::rotate;
... You get the idea ...
Y luego haces esto en tu archivo fuente
void f1() {
#include "foo"
}
void f2() {
}
void f3() {
#include "foo"
}
Nota: No estoy abogando por hacer cosas como esta. Pero es posible y se hace en algunas bases de código y no veo por qué no debería estar permitido. Que no tienen sus usos.
También podría ser que el archivo que incluye se comporte de manera diferente según el valor de ciertas macros #define
. Por lo tanto, es posible que desee incluir el archivo en varias ubicaciones, después de haber cambiado primero algún valor, para obtener un comportamiento diferente en diferentes partes de su archivo fuente.
#ifdefs
. Entonces podría decir#define MODE_ONE 1
y luego#include "has-modes.h"
, y luego#undef MODE_ONE
con#define MODE_TWO 1
y#include "has-modes.h"
otra vez. El preprocesador es agnóstico sobre este tipo de cosas, y tal vez a veces pueden tener sentido.