"... в то время как другие заявления делают".
Во-первых, директивы препроцессора не являются операторами . Заявление - это сущность, которая существует только на синтаксическом / семантическом уровне. Директивы препроцессора обрабатываются на относительно ранних этапах перевода, до того, как начинается какой-либо синтаксический анализ, поэтому на этом этапе еще нет такой вещи, как «оператор». И по этой причине нет разумного обоснования требовать завершения директивы #include
точкой с запятой. На самом деле директивы препроцессора по определению занимают всю строку, что означает, что они уже заканчиваются символом новой строки. Любой дополнительный терминатор будет излишним.
Во-вторых, не все «другие утверждения» заканчиваются точкой с запятой. Например, составной оператор не
i = 5;
{ /* <- compound statement begins here... */
i = 10;
} /* <- ... and ends here. Note: no semicolon */
i = 15;