Sie können #include
überall in einer Datei verwenden, nicht nur im globalen Bereich - wie innerhalb einer Funktion (und bei Bedarf mehrmals). Sicher, hässlich und nicht gut, aber möglich und gelegentlich sinnvoll (abhängig von der Datei, die Sie einschließen). Wenn #include
es nur eine einmalige Sache wäre, würde das nicht funktionieren. #include
macht doch nur dumme Textersetzung (cut'n'paste), und nicht alles, was Sie einschließen, muss eine Header-Datei sein. Sie können beispielsweise #include
eine Datei mit automatisch generierten Daten enthalten, die die Rohdaten zum Initialisieren von a enthalten std::vector
. Mögen
std::vector<int> data = {
#include "my_generated_data.txt"
}
Und muss "my_generated_data.txt" etwas sein, das vom Build-System während der Kompilierung generiert wird.
Oder vielleicht bin ich faul / albern / dumm und füge dies in eine Datei ein ( sehr erfundenes Beispiel):
const noexcept;
und dann tue ich es
class foo {
void f1()
#include "stupid.file"
int f2(int)
#include "stupid.file"
};
Ein anderes, etwas weniger ausgeklügeltes Beispiel wäre eine Quelldatei, in der viele Funktionen eine große Anzahl von Typen in einem Namespace verwenden müssen, aber Sie möchten nicht nur using namespace foo;
global sagen, da dies den globalen Namespace mit vielen anderen Dingen verschmutzen würde du willst nicht Sie erstellen also eine Datei "foo" mit
using std::vector;
using std::array;
using std::rotate;
... You get the idea ...
Und dann tun Sie dies in Ihrer Quelldatei
void f1() {
#include "foo"
}
void f2() {
}
void f3() {
#include "foo"
}
Hinweis: Ich befürworte nicht, solche Dinge zu tun. Aber es ist möglich und in einigen Codebasen erledigt und ich verstehe nicht, warum es nicht erlaubt sein sollte. Es hat seine Verwendung.
Es kann auch sein, dass sich die von Ihnen eingeschlossene Datei je nach Wert bestimmter Makros unterschiedlich verhält #define
. Daher möchten Sie die Datei möglicherweise an mehreren Speicherorten einfügen, nachdem Sie zuerst einen Wert geändert haben, damit Sie in verschiedenen Teilen Ihrer Quelldatei ein unterschiedliches Verhalten erhalten.
#ifdefs
. Also könnte man sagen#define MODE_ONE 1
und dann#include "has-modes.h"
und dann#undef MODE_ONE
mit#define MODE_TWO 1
und#include "has-modes.h"
wieder. Der Präprozessor ist in Bezug auf diese Art von Dingen agnostisch, und vielleicht können sie manchmal Sinn machen.