2010-03-03 20 views
5

Questa è probabilmente una domanda stupida, ma mi trovo sempre a chiedermi quale sia lo standard.Che cosa significa restituire zero per convenzione?

Nella maggior parte dei casi (per non dire tutti) dei primi esempi di C++, è possibile visualizzare la funzione principale che restituisce il valore 0. Ciò significa che l'operazione è andata bene o no?

  • 0 -> OK
  • 1 -> No OK.
  • Altro ->?

Qual è il modo standard per farlo?

A proposito, è meglio restituire un numero intero o un valore booleano in questo caso?

Grazie ragazzi!

+0

per qualche motivo mi hai appena ricordato dell'Assemblea !! – medopal

risposta

6

0 o EXIT_SUCCESS significa successo. EXIT_FAILURE significa fallimento. Qualsiasi altro valore è definito dall'implementazione e non è garantito che sia supportato. In particolare, std::exit(1) o return 1; non sono in realtà garantiti per indicare un errore, sebbene sulla maggior parte dei sistemi comuni lo faranno.

EXIT_SUCCESS e EXIT_FAILURE sono definiti in <cstdlib>.

Edit: Suppongo che potrebbe essere utile per fare un esempio specifico del sistema:

L'utilità GNU make restituisce un exit status al sistema operativo:

  • 0: Lo stato di uscita è zero se fare ha successo.
  • 2: lo stato di uscita è due se si verificano errori. Stampa i messaggi che descrivono gli errori particolari.
  • 1: lo stato di uscita è uno se si utilizza il flag `-q 'e si determina che alcuni target non sono già aggiornati.

La possibilità di impostare più valori diversi di errore significa che è possibile specificare esattamente come il programma è fallito. Ci sono due avvertimenti, però:

  • Non esiste nessuna convenzione per i codici di stato di errore, per quanto ne so
  • Ciò funzionerà su "normali" sistemi operativi (Windows, OS X, Unix), ma non è garantito dal C++ standard; quindi potrebbe non funzionare se hai provato a eseguire il porting su VMS o su un sistema embedded.
+0

Potrebbe essere utile sottolineare che su Linux se un'applicazione viene terminata da un segnale, il suo codice di uscita sarà il valore numerico del segnale (ad esempio 11 per SIGSEGV). Ma sì, non esiste uno standard unico, a parte EXIT_SUCCESS e EXIT_FAILURE – sbk

2

0 è ok, altri valori sono un codice di errore. La funzione principale dovrebbe restituire un int e nient'altro secondo lo standard. La domanda è stata discussa prima a What should main() return in C and C++?

0

All'inizio C non c'era nessun concetto di eccezione. Quindi i programmatori si sono serviti utilizzando i codici di errore e definito 0 come nessun errore. Tutti gli altri codici di errore hanno il loro significato, definito dal programmatore.

Questo schema è stato preso in C++. Ma al giorno d'oggi hai anche il concetto di lanciare eccezioni sugli errori (che è uno stile OOP migliore).Quel principale usa ancora int come il valore di ritorno ha ragioni storiche.

+0

lanciare un'eccezione per uscire da 'main' non è comunque una buona pratica. –

+0

Perché causerà un'eccezione non rilevata e altri programmi non possono rilevare tali eccezioni. – Aurril

+0

Il mio punto è che l'interlocutore chiedeva specificamente di "main", non dei valori di ritorno delle funzioni in generale. –

0

Questa non è una regola, ma più di una decisione di progettazione (anche se, se non ricordo male, alcuni standard come POSIX hanno le loro definizioni)

0 come valore di ritorno è considerato 'normale' o 'OK . Dove, quando si restituisce qualcosa other than 0, è può essere OK o Errore. Ad esempio, se si emette una chiamata read(), è possibile che venga restituito il numero di byte letti come valore positivo, che non è certamente un errore. Ma se restituisce 0 significa fine file. Qualsiasi valore negativo da esso significherebbe qualche errore nella lettura.

+0

È una decisione di progettazione presa dagli scrittori standard C++: 0 significa successo quando si torna da 'main'. –

0
  1. Il significato di zero. Dipende molto dal design di classe/funzione. Dovrebbe essere parte della documentazione su come i clienti devono trattare il valore di ritorno. Ad esempio, i metodi COM restituiscono zero per indicare un'operazione riuscita (c'è la costante S_OK uguale a zero). Le operazioni sui file Windows (CreateFile, ecc.) Restituiscono non-zero in caso di operazione riuscita. Vedi, dipende. L'unica convenzione che potrebbe essere su di esso è: il codice deve essere documentato !!!
  2. Cosa è meglio restituire. Penso che lo int potrebbe essere migliore per le funzioni più complicate (in cui potrebbe essere necessario analizzare un potenziale errore). Dal momento che int e bool sono in genere restituiti nel EAX registro (supponendo che si è sulla x86 architettura), senza memoria aggiuntiva è necessaria per restituire un int invece di un bool.
0

In origine il valore restituito corrispondeva a un codice di errore. Immagina che ci sia un grande tavolo di tutti i possibili esiti errati che un programma potrebbe avere. Il programma termina; vuoi sapere cosa, se non altro, è andato storto. Se fosse stato restituito un intero diverso da zero, dovresti cercare nella tabella dei codici di errore. Se viene restituito 0, equivale a "niente è andato storto".

L'ho messo solo così perché a volte le persone trovano non intuitivo che 0 significhi qualcosa di buono. È come se il vetro fosse completamente vuoto ... di veleno.

0

Questo è un residuo del retaggio C/Unix.

Se il programma viene chiamato all'interno di uno script, è utile per lo script sapere se il programma ha avuto esito positivo. Così, è nata la convenzione di restituire 0 per il successo da programmi eseguibili.

C non ha tipi booleani nativi, quindi questo era un numero intero. E questo ci ha permesso di restituire numeri diversi per diversi tipi di errori.

Questa convenzione si diffondeva a funzioni regolari, poiché, come altri hanno pubblicato, C/C++ non aveva originariamente eccezioni, e anche una volta che avevamo delle eccezioni, ci volle disciplina per usarle correttamente, e c'era molta legacy codice (e programmatori legacy) utilizzando la convenzione del valore di ritorno.

Se tutto ciò che ti interessa è successo/fallimento, allora lo sarà 0 per il fallimento e 1 per il successo.Per i valori di ritorno interni, anche se attualmente ci sono solo due valori, consiglierei di usare un tipo enum poiché i bi-stati hanno un modo di evolvere in tri-stati, e sarà più facile seguire ciò che stai facendo.

+0

Questo è molto tardi. Ma diresti che la condizione di controllo nello script sarebbe una specie di if-else e quindi l'idea di restituire uno 0 e interrompere il controllo if-else? –

+1

Sì, qualcosa del genere. Oppure possono essere messi insieme su una riga di comando con && in modo che un errore del primo comando causi un cortocircuito e impedisca il richiamo del secondo processo. – JohnMcG