Что такое механизм объявления локальной функции C?

Кажется, что локальное объявление функции разрешено в gcc, и я нашел обсуждение этого:Есть ли какое-либо применение для объявлений локальных функций?

Однако, мой вопрос: это разрешено стандартом ISO C? Если это так, как объяснить следующее явление, которое ставит его в тупик:

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

в то время как

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

Согласно стандарту C99: имена функций находятся в той же категории именования. Итак, мы обсудим механизм определения объема, чтобы объяснить это. Но как?

На самом деле, я работаю над проектом курса по компилятору, который требует от нас реализации упрощенной версии компилятора Си. Я пытался разобраться с этим делом, но запутался.

РЕДАКТИРОВАТЬ: Я знаю, что общеизвестно, что C ориентирован на процедуры и требует, чтобы имена функций были уникальными. Но этот местный стиль декларации мешает ясной ситуации, и мне трудно понять его принцип / правило.

Ответы на вопрос(3)

Ваш ответ на вопрос