Это особенность синтаксиса Си. В BNF определение функции выглядит как
FUNC_DEF ::= TYPE IDENTIFIER "(" PARAM_LIST ")" BLOCK
при утверждении
STATEMENT ::= (EXPRESSION | DECLARATION | CONTROL | ) ";" | BLOCK
BLOCK ::= "{" STATEMENT* "}"
(упрощено, чтобы разрешить смешанные объявления и операторы, что C ++ допускает, но C не позволяет), а оператор if
равен
CONDITIONAL ::= "if" "(" EXPRESSION ")" STATEMENT
пропуская часть else
на данный момент.
Причина в том, что в противном случае вы могли бы написать функцию
void no_op() {}
1021 * а *
void no_op();
но последний синтаксис уже используется для обозначения объявления.