Di recente ho dovuto digitare un piccolo programma di test C e, nel processo, ho commesso un errore di ortografia nella funzione principale utilizzando accidentalmente vooid
anzichévoid
.
Eppure ha ancora funzionato.
Riducendolo alla sua versione completa più piccola, ho finito con:
int main (vooid) {
return 42;
}
Questo effettivamente compila (gcc -Wall -o myprog myprog.c
) e, quando eseguito, restituisce 42.
Come è esattamente questo codice valido?
Ecco una trascrizione tagliata e incollata dalla mia bash
shell per mostrare cosa sto facendo:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
main
rispetto alle due standard canoniche standard. Per la portabilità, dovresti usare uno di quei due ma non credo che UB si applichi qui.
main
deve avere una delle 2 forme canoniche (2.1.2.2). Ma hai ragione @pax, in un ambiente indipendente, l'identificatore non main
è affatto speciale: se usato come funzione può essere di qualsiasi tipo e avere un numero qualsiasi di parametri di qualsiasi tipo.
int main (int argc, char *argv[], char *envp[]);
di essere conforme ).
int
parametro, si richiama il comportamento indefinito . Tutto può succedere :)