Что такое механизм объявления локальной функции 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 ориентирован на процедуры и требует, чтобы имена функций были уникальными. Но этот местный стиль декларации мешает ясной ситуации, и мне трудно понять его принцип / правило.