During compilation, your code is processed by two separate programs, a preprocessor and a compiler. The preprocessor works first.
Your code actually consists of two languages, one superimposed on top of each other. The preprocessor deals with one language, which is all directives starting with "#" (and the consequences of these directives). It processes "#include", "#define" and other directives and leaves the rest of the code intact (well, except as a side effect of preprocessor directives such as macro substitutions, etc.).
Then the compiler comes and processes the output generated by the preprocessor. It deals with the "C" language and largely ignores preprocessor directives.
The answer to your question is that "#include" is part of the language processed by the preprocessor, and in that language ";" are not required and, in fact, are “additional tokens”.
source share