2015-11-17 21 views
7

In C, è necessario il int main(int argc, char *argv[]) per ricevere gli argomenti del programma? In altre parole, quando si definisce la funzione principale con la firma int main(void), è possibile recuperare gli argomenti del programma utilizzando solo interfacce POSIX?In POSIX, un main (void) può recuperare gli argomenti della riga di comando?

Mi sento come se mi manca qualcosa, visto che:

  • POSIX definisce interfacce multiple per recuperare altre informazioni specifiche del processo. Ad esempio, esistono interfacce per variabili di ambiente (probabilmente ereditate da C99, ma anche estese con funzioni come unsetenv()) e identificazione dell'host (gethostid()).
  • Sistemi operativi specifici definiscono metodi "globali" per recuperare gli argomenti della riga di comando. Ad esempio, Windows fornisce le funzioni GetCommandLineW e CommandLineToArgvW e HP-UX fornisce le variabili globali __argc_value e __argv_value. Linux ha /proc/self/cmdline, che può essere analizzato in argv e argc.
+0

Direi che è stata definita l'implementazione. –

+0

Considera una funzione 'int f (void)'. Come si accede agli argomenti passati alla funzione dal chiamante? – Olaf

+1

Per quanto riguarda Windows, si noti che Windows utilizza un [modo completamente definito dall'implementazione per definire il main] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633559%28v=vs.85%29. aspx), che potrebbe spiegare la necessità di ottenere argomenti dalla riga di comando tramite funzioni API non standard separate. – Lundin

risposta

4

Le specifiche POSIX non includono funzioni che possono recuperare gli argomenti della riga di comando. Tutte le funzioni specificate richiedono, in sostanza, main() per orchestrare passando argc e argv da analizzare.

Specifiche POSIX (IEEE 1003.1, edizione 2013 - la versione corrente mentre scrivo questo) ha una sezione che descrive la sintassi della riga di comando utilizzata dalle utilità standard (che sono descritte nel volume "Shell e utilità"). Tuttavia, tali programmi di utilità - abbastanza naturalmente - utilizzerebbero le funzioni POSIX, quindi sarebbero implementati con un main(argc, argv) che li chiama.