Вот некоторый код из рассматриваемого файла, называемый Global.h, который используется в других заголовочных файлах и, кажется, прекрасно компилируется:
#pragma once
enum SType {null, lab, assignment, testPrep};
enum Code {none, 123, 222, 333, 432};
template<typename D>
bool validate(D task = string, D date = string) {
bool result = true;
if (task.size() < 3) {
cout << "Task too simple, please elaborate." << endl;
result = false;
}
else if (task.size() > 50) {
cout << "Task too detailed. Only 30 chars allowed." << endl;
task.empty();
result = false;
}
if (date == "02/20/93") {
date.empty();
date = "My birthday!";
}
return result;
}
Как вы можете видеть, я могу использовать строковые и ostream-объекты, не объявляя об использовании пространства имен или конкретного файла. Очевидно, это означает, что Global.h извлекает информацию откуда-то еще, но мне интересно, откуда эта информация поступает? Я всегда думал, что заголовочный файл восстановит код из других файлов, только если они были включены в директиву #include в самом файле, поэтому я не уверен, как это происходит, и мне любопытно узнать, что происходит.
Нет, это просто, что бы это ни было Global.h
заголовочный файл должен быть уже #include
все необходимые заголовки.
Что-то вроде упрощения: #include
Оператор заменяется логической вставкой содержимого #include
д файл вместо #include
Само заявление. Когда вы компилируете модуль перевода, все #include
заявления обрабатываются таким образом. Как будто все #include
операторы логически заменяются содержимым ссылочного файла. Конечным результатом является один логический исходный файл, модуль перевода, который компилируется от начала до конца.
Так что, если все-таки #include
оператор обрабатываются таким образом, пока необходимые файлы заголовков, <iostream>
и другие логически вставляются в блок логического перевода до того, как классы и другие ресурсы <iostream>
на которые ссылаются из этого заголовочного файла, этот модуль перевода будет компилироваться без проблем. Будь то тот же заголовочный файл, который #include
s необходимые заголовочные файлы, <iostream>
и другие; или какой-то другой заголовочный файл, который получает #include
раньше, который #include
s эти заголовочные файлы; это не важно
Это правда, что хорошая практика показывает, что каждый файл должен явно #include
его предпосылки. Но если это не так, пока какой-то другой заголовочный файл уже был #include
d, модуль перевода по-прежнему будет компилироваться.
Других решений пока нет …