Is it possible for a missing #include to break the program at runtime?
Yes, that's possible.
Everything concerning #include
s happens at compile time. But compile time things can change behavior at runtime, of course:
some/code.h
:
#define FOO
int foo(int a) { return 1; }
then
#include <iostream>
int foo(float a) { return 2; }
#include "some/code.h" // Remove that line
int main() {
std::cout << foo(1) << std::endl;
#ifdef FOO
std::cout << "FOO" std::endl;
#endif
}
With the #include
, overload resolution finds the more appropriate foo(int)
and hence prints 1
instead of 2
. Also, since FOO
is defined, it additionally prints
FOO
.
That's just two (unrelated) examples that came to my mind immediately, and I'm sure there are plenty more.
Yes, it's perfectly possible. I'm sure there are lots of ways, but suppose the include file contained a global variable definition which called a constructor. In the first case the constructor would execute, and in the second it wouldn't.
Putting a global variable definition in a header file is poor style, but it's possible.