So che il thread è vecchio, ma questa domanda mi ha infastidito per un po 'di anni fa, quindi ho voluto inserire il mio mezzo centesimo (se quello).
Trovo sempre che C funzioni come se avessero una quantità fissa di argomenti indipendentemente dal contesto, a meno che non utilizzino va_args. Cioè, ho fiducia principale di avere sempre il prototipo:
int main(int argc, char **argv).
anche se sono passati senza argomenti, la funzione ha questi argomenti sullo stack perché la funzione principale non ha funzione di sovraccarico.
C ha la capacità di avere un sovraccarico primitivo semplicemente facendo finta che l'argomento non sia presente. In tal caso, l'argomento è ancora passato ed è in pila ma non lo si accede mai, quindi riduce semplicemente la dimensione del codice sorgente.
Dicendo int main() significa semplicemente che so che la funzione potrebbe avere parametri, ma non li sto utilizzando, quindi scrivo int main().
Dire int main (void) dice che principale ha certamente nessun argomento, e implica che ci sono due diversi prototipi di funzione:
int main(void);
int main(int argc, char **argv);
Dato che C non ha alcuna funzione sovraccarico, questo è un po 'fuorviante per me, e Diffido del codice che ha il principale (vuoto) in esso. Non lo farei se main non avesse MAI preso alcun parametro, nel qual caso main (void) sarebbe completamente OK.
NOTA: In alcune implementazioni, ci sono più parametri in main che argc e argv, come env, ma questo non mi infastidisce perché so che non dico esplicitamente che quelli sono gli unici due parametri, ma quelli sono i parametri minimi e va bene avere di più, ma non di meno. Questo è in contrasto con il vero detto int main (void) che mi urla come QUESTA FUNZIONE NON HA PARAMETRI, il che non è vero, dal momento che lo fa, vengono semplicemente omessi.
Ecco il mio codice base:
/* sample.c - build into sample. */
#include <stdio.h>
int main(void)
{
int _argc = *((int *)2686800);
char ***_pargv = (char ***)2686804;
int i;
for (i = 1; i < _argc; ++i) {
printf("%s ", (*_pargv)[i]);
}
return 0;
}
./sample ho chiaramente argomenti
La funzione ha chiaramente argomenti passati ad esso, nonostante andando fuori del modo di dire esplicitamente che doesn' t digitando void nel prototipo della funzione.
Come Eq- dice sopra:
(6.7.6.3p10) Il caso particolare di un parametro senza nome di tipo vuoto come unico elemento nell'elenco specifica che la funzione ha parametri.
Così dicendo che la funzione è vuota come argomento ma in realtà avere argomenti in pila è una contraddizione.
Il mio punto è che gli argomenti sono ancora lì, quindi affermare esplicitamente che il principale è privo di argomenti è disonesto. Il modo onesto sarebbe quello di dire int main(), che non pretende nulla su quanti parametri ha, solo su quanti parametri ti interessa.
NOTA 2: Il _argc, _pargv dipendono dal sistema, per trovare il vostro valori li si deve scoprire eseguendo questo programma:
/* findargs.c */
#include <stdio.h>
int main(int argc, char **argv)
{
printf("address of argc is %u.\n", &argc);
printf("address of argv is %u.\n", &argv);
return 0;
}
Questi valori dovrebbero rimanere corretto per il sistema specifico.
C99 e C11 non menzionano più 'int main()'. Basta usare 'int main (void)'. Vedere 5.1.2.2.1 "Avvio del programma" dello standard: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf – superlukas