O que é o mecanismo de declaração de função local C?

A declaração de função local parece ser permitida no gcc, e eu encontrei uma discussão sobre isso:Existe algum uso para declarações de função local?

No entanto, minha pergunta é: é permitido pelo padrão ISO C? Se for, como explicar o seguinte fenômeno que o torna intrigante:

int main(void) {
    int f(void);
    f();
}
void g(void) {
    /* g has no idea about f. It seems that the decl is limited within its
     * scope */
    f(); 
}
int f(void) {}

enquanto

int main(void) {
    int f(void);
    f();
}
void f(void); /* error because disagreement with the local declaration (local
             declaration goes beyound its scope?) */
void f(void) { /* definition here */ }

De acordo com o padrão C99: os nomes das funções estão na mesma categoria de nomenclatura. Então, discutiremos o mecanismo de escopo para explicar isso. Mas como?

Na verdade, estou trabalhando em um projeto de curso do compilador que exige a implementação de uma versão simplificada do compilador C. Eu estava tentando lidar com este caso, mas fiquei confuso.

EDITAR: Eu sei que é do conhecimento geral que C é orientado a procedimentos e requer que os nomes das funções sejam exclusivos. Mas esse estilo local de declaração agita uma situação clara e é difícil para mim entender seu princípio / regra.

questionAnswers(3)

yourAnswerToTheQuestion