È in gran parte una questione di preferenze personali, anche se alcuni luoghi potrebbero renderlo uno standard di codifica formale. C non gliene importa.
Da parte mia, se sto definendo più funzioni in un singolo file sorgente, definirò le funzioni chiamate prima del chiamante:
void foo( void )
{
...
}
void bar( void )
{
...
foo();
...
}
int main( void )
{
...
bar();
...
}
invece di
int main( void )
{
void bar( void );
...
bar();
...
}
void bar( void )
{
void foo( void );
...
foo();
}
void foo( void )
{
...
}
Il problema con l'utilizzo delle dichiarazioni anticipate aumenta il carico di manutenzione; se cambi il prototipo di funzione (tipo di ritorno, numero e / o tipi di parametri), ora devi apportare quelle modifiche in due posti invece di uno.
Naturalmente, se chiami funzioni definite in un file sorgente diverso, hai bisogno di dichiarazioni separate (preferibilmente raggruppate nel loro file di intestazione):
/**
* functions.c
*/
#include "functions.h"
void foo( void ) // Note that I'm still defining called functions
{ // before their callers, even though in this case
... // it's not necessary, since "functions.h" contains
} // the declaration for foo().
void bar( void )
{
...
foo();
...
}
/**
* functions.h
*/
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
void foo( void );
void bar( void );
#endif
/**
* main.c
*/
#include "functions.h"
int main( void )
{
...
bar();
...
}
Does this apply to all programming languages that uses main() as the entry point of the program?
Ancora una volta, per la maggior parte di quelle lingue, è strettamente una questione di stile e preferenze personali. La stessa definizione del linguaggio non interessa.