Możesz używać w #include
dowolnym miejscu w pliku, nie tylko w zakresie globalnym - jak np. Wewnątrz funkcji (i wielokrotnie, jeśli to konieczne). Jasne, brzydkie i nie w dobrym stylu, ale możliwe i czasami rozsądne (w zależności od dołączonego pliku). Gdyby to #include
było tylko jednorazowe, to by nie zadziałało. #include
po prostu robi głupie podstawianie tekstu (wytnij i wklej) w końcu, a nie wszystko, co dołączasz, musi być plikiem nagłówkowym. Możesz - na przykład - #include
plik zawierający automatycznie wygenerowane dane zawierające surowe dane do zainicjowania pliku std::vector
. Lubić
std::vector<int> data = {
#include "my_generated_data.txt"
}
I niech „my_generated_data.txt” będzie czymś wygenerowanym przez system kompilacji podczas kompilacji.
A może jestem leniwy / głupi / głupi i umieściłem to w pliku ( bardzo wymyślny przykład):
const noexcept;
a potem robię
class foo {
void f1()
#include "stupid.file"
int f2(int)
#include "stupid.file"
};
Innym, nieco mniej wymyślnym przykładem byłby plik źródłowy, w którym wiele funkcji musi używać dużej liczby typów w przestrzeni nazw, ale nie chcesz mówić tylko using namespace foo;
globalnie, ponieważ spowodowałoby to polutowanie globalnej przestrzeni nazw wieloma innymi rzeczami nie chcesz. Więc tworzysz plik „foo” zawierający
using std::vector;
using std::array;
using std::rotate;
... You get the idea ...
A potem robisz to w swoim pliku źródłowym
void f1() {
#include "foo"
}
void f2() {
}
void f3() {
#include "foo"
}
Uwaga: nie zalecam robienia takich rzeczy. Ale jest to możliwe i zrobione w niektórych bazach kodu i nie rozumiem, dlaczego nie powinno to być dozwolone. To ma mieć swoje zastosowanie.
Może się również zdarzyć, że dołączony plik zachowuje się inaczej w zależności od wartości niektórych makr #define
. Możesz więc chcieć dołączyć plik w wielu lokalizacjach, po uprzedniej zmianie pewnej wartości, aby uzyskać różne zachowanie w różnych częściach pliku źródłowego.
#ifdefs
. Więc możesz powiedzieć#define MODE_ONE 1
i wtedy#include "has-modes.h"
, a potem#undef MODE_ONE
z#define MODE_TWO 1
i#include "has-modes.h"
jeszcze raz. Preprocesor jest agnostykiem w stosunku do tego typu rzeczy i może czasami mają one sens.