Sure you can reuse a cached file at a token level, but you cannot easily do that at the parse tree can be completely different based on preprocessor state.
I'm just showing how a compiler could optimize files that have include guards. This doesn't do anything for files that are intended to be included multiple times.