https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101628
--- Comment #3 from David Post <david.post at ohyonghao dot com> --- This seems to be implementation dependent. As per 15.1.6: The implementation can process and skip sections of source files conditionally, include other source files, import macros from header units, and replace macros. These capabilities are called preprocessing, because conceptually they occur before translation of the resulting translation unit. and 15.2.14 Each directive's condition is checked in order. If it evaluates to false (zero), the group that it controls is skipped: But what you are implying is that skipped means that you process it anyway, then ignore the result, whereas other implementations take this to mean that the group is skipped over and not processed. This seems to be an implementation decision rather than a requirement by the standard, or am I missing the part of the standard which states that those tokens must still be valid?