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 #includebyło tylko jednorazowe, to by nie zadziałało. #includepo 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 - #includeplik 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 1i wtedy#include "has-modes.h", a potem#undef MODE_ONEz#define MODE_TWO 1i#include "has-modes.h"jeszcze raz. Preprocesor jest agnostykiem w stosunku do tego typu rzeczy i może czasami mają one sens.