Here's some the code from the file in question, called Global.h, which is used in other header files and seems to compile just fine:
#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;
}
As you can see I'm able to use string and ostream objects without declaring the use of a namespace or particular file. Obviously this means that Global.h is drawing the information from somewhere else, but I'm curious as to where this information is coming from? I always thought that a header file will only reconize code from other files if they've been included with the #include directive in the file itself, so I'm not sure how this is happening and am curious to know what's going on.
No. It's just that whatever is including this Global.h
header file must be already #include
ing all the required headers.
Somewhat of a simplication: an #include
statement gets replaced by logically inserting the contents of the #include
d file in place of the #include
statement itself. When you compile a translation unit, all #include
statements are processed in this manner. As if all #include
statements get logically replaced by the contents of the referenced file. The final result is a single logical source file, a translation unit, that gets compiled from start to finish.
So, if after all #include
statement are processed in this manner, as long as the requisite header files, <iostream>
, and others, get logically inserted in the logical translation unit prior to the classes and other resources from <iostream>
that are referenced from this header file, this translation unit will compile without issues. Whether it's the same header file that #include
s the required header files, <iostream>
and others; or some other header file that gets #include
d earlier, which #include
s these header files; it doesn't matter.
It is true that good practice indicates that each file should explicitly #include
its prerequisites. But if it doesn't, as long as some other header file has already been #include
d, the translation unit will still compile.