Was ist der Deklarationsmechanismus für C-lokale Funktionen?

Lokale Funktionsdeklaration scheint in gcc erlaubt zu sein, und ich fand eine Diskussion dazu:Gibt es eine Verwendung für lokale Funktionsdeklarationen?

Meine Frage ist jedoch: Ist es gemäß ISO C-Standard zulässig? Wenn ja, wie erklärt man das folgende Phänomen, das es verwirrt:

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) {}

während

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 */ }

Nach dem C99-Standard: Funktionsnamen gehören zur selben Benennungskategorie. Wir werden daher den Scoping-Mechanismus diskutieren, um dies zu erklären. Aber wie?

Derzeit arbeite ich an einem Compiler-Kursprojekt, bei dem wir eine vereinfachte Version des C-Compilers implementieren müssen. Ich habe versucht, mich mit diesem Fall zu befassen, war aber verwirrt.

BEARBEITEN: Ich weiß, es ist allgemein bekannt, dass C prozedurorientiert ist und dass Funktionsnamen eindeutig sein müssen. Aber dieser lokale Erklärungsstil schafft eine klare Situation und es fällt mir schwer, sein Prinzip / seine Regel zu verstehen.