Ви можете використовувати #include
будь-яке місце у файлі, а не лише в глобальному масштабі, наприклад, усередині функції (і кілька разів, якщо це потрібно). Звичайно, потворний та невдалий стиль, але можливий та інколи розумний (залежно від файлу, який ви включаєте). Якби #include
коли-небудь була лише одна річ, то це не спрацювало б. #include
просто зрештою виконує заміну німого тексту (cut'n'paste), і не все, що ви включаєте, має бути файлом заголовка. Ви можете - наприклад - #include
файл, що містить автоматично створені дані, що містять необроблені дані, для ініціалізації файлу std::vector
. Подібно до
std::vector<int> data = {
#include "my_generated_data.txt"
}
І нехай "my_generated_data.txt" буде чимось, що генерується системою складання під час компіляції.
Або, можливо, я ледачий / дурний / дурний і поміщаю це у файл ( дуже надуманий приклад):
const noexcept;
а потім роблю
class foo {
void f1()
#include "stupid.file"
int f2(int)
#include "stupid.file"
};
Іншим, трохи менш надуманим, прикладом може бути вихідний файл, де багатьом функціям потрібно використовувати велику кількість типів у просторі імен, але ви не хочете просто говорити using namespace foo;
глобально, оскільки це призведе до того, що глобальний простір імен отримає багато іншого ти не хочеш. Отже, ви створюєте файл "foo", що містить
using std::vector;
using std::array;
using std::rotate;
... You get the idea ...
А потім ви робите це у своєму вихідному файлі
void f1() {
#include "foo"
}
void f2() {
}
void f3() {
#include "foo"
}
Примітка: Я не прихильник робити такі речі. Але це можливо і робиться в деяких кодових базах, і я не розумію, чому це не слід дозволяти. Це дійсно має свої переваги.
Також може бути, що файл, який ви включаєте, поводиться по-різному, залежно від значення певних макросів #define
. Отже, ви можете захотіти включити файл у кілька розташувань, після того, як спочатку змінили якесь значення, тож ви отримаєте різну поведінку в різних частинах вихідного файлу.
#ifdefs
. Тож можна сказати#define MODE_ONE 1
і потім#include "has-modes.h"
, і потім#undef MODE_ONE
з#define MODE_TWO 1
і#include "has-modes.h"
знову. Препроцесор агностично ставиться до таких видів речей, і, можливо, іноді вони можуть мати сенс.