Заголовочные файлы не включены в файл, но все еще могут использовать классы / функции из не включенных заголовочных файлов

Вот некоторый код из рассматриваемого файла, называемый 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 в самом файле, поэтому я не уверен, как это происходит, и мне любопытно узнать, что происходит.

0

Решение

Нет, это просто, что бы это ни было Global.h заголовочный файл должен быть уже #includeвсе необходимые заголовки.

Что-то вроде упрощения: #include Оператор заменяется логической вставкой содержимого #includeд файл вместо #include Само заявление. Когда вы компилируете модуль перевода, все #include заявления обрабатываются таким образом. Как будто все #include операторы логически заменяются содержимым ссылочного файла. Конечным результатом является один логический исходный файл, модуль перевода, который компилируется от начала до конца.

Так что, если все-таки #include оператор обрабатываются таким образом, пока необходимые файлы заголовков, <iostream>и другие логически вставляются в блок логического перевода до того, как классы и другие ресурсы <iostream> на которые ссылаются из этого заголовочного файла, этот модуль перевода будет компилироваться без проблем. Будь то тот же заголовочный файл, который #includes необходимые заголовочные файлы, <iostream> и другие; или какой-то другой заголовочный файл, который получает #includeраньше, который #includes эти заголовочные файлы; это не важно

Это правда, что хорошая практика показывает, что каждый файл должен явно #include его предпосылки. Но если это не так, пока какой-то другой заголовочный файл уже был #included, модуль перевода по-прежнему будет компилироваться.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]