Newsgroup: it.comp.lang.c++
Titolo: Curiosità... da impazzire!

Ho trovato questa funzione su MSDN.
Si è creato un dibattito con un collega perchè ritiene che la funziona
exit() non debba essere usata.
Leggendo il codice la procedura esce se sulla linea di comando non ci sono 3
paramentri (compreso il nome dell'eseguibile). Ho comunque aggiunto una riga
di commento per visualizzarla rapidamente!
Ora mi chiedo a cosa possa allora servire la funzione exit()!!
Spero di ricevere commenti anche da parte vostra.
Grazie a tutti.
--------------------------------------------------
#ifndef UNICODE
#define UNICODE
#endif
#include <stdio.h>
#include <windows.h>
#include <lm.h>
int wmain(int argc, wchar_t *argv[])
{
   DWORD dwLevel = 10;
   LPUSER_INFO_10 pBuf = NULL;
   NET_API_STATUS nStatus;
   if (argc != 3)
   {
      fwprintf(stderr, L"Usage: %s \\\\ServerName UserName\n", argv[0]);
      exit(1);                        // **** QUESTA E' LA RIGA IN
QUESTIONE! ****
   }
   //
   // Call the NetUserGetInfo function; specify level 10.
   //
   nStatus = NetUserGetInfo(argv[1],
                            argv[2],
                            dwLevel,
                            (LPBYTE *)&pBuf);
   //
   // If the call succeeds, print the user information.
   //
   if (nStatus == NERR_Success)
   {
    if (pBuf != NULL)
      {
         wprintf(L"\n\tAccount:      %s\n", pBuf->usri10_name);
         wprintf(L"\tComment:      %s\n", pBuf->usri10_comment);
         wprintf(L"\tUser comment: %s\n", pBuf->usri10_usr_comment);
         wprintf(L"\tFull name:    %s\n", pBuf->usri10_full_name);
      }
   }
   // Otherwise, print the system error.
   //
   else
      fprintf(stderr, "A system error has occurred: %d\n", nStatus);
   //
   // Free the allocated memory.
   //
   if (pBuf != NULL)
      NetApiBufferFree(pBuf);
   return 0;
}

 
IMHO la funzione in oggetto andrebbe utilizzata solo in programmi C e 
solo in casi "estremi" in cui non è possibile terminare il programma 
ritornando normalmente dal main. 
L'esempio che hai riportato ne fa (sempre IMHO) un uso "barbaro", visto 
che un normale return avrebbe svolto lo stesso servizio permettendo però 
a chi guardava il codice di individuare immediatamente i possibili punti 
di uscita dalla funzione.
Oltre alle considerazioni sulla leggibilità del codice, non sono sicuro 
che una exit() rilasci tutte le risorse allocate per il processo (mi 
riferisco a risorse come, ad esempio, gli handle TAPI che non vengono 
rilasciati automaticamente e, sotto windows 9X/ME lasciano il 
dispositivo "bloccato").
Probabilmente per programmi che hanno un message loop è più indicata 
PostQuitMessage e per programmi C++ la generazione di un'eccezione.
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 Ora mi chiedo a cosa possa allora servire la funzione exit()!!
In C++ standard exit() termina l'esecuzione saltando la distruzione
delle variabili automatiche, ma non quella delle variabili statiche, ne
la chiusura di stream C .
Ciao,
Nicola

Per quanto ne so io (ma non ne sono sicuro) il return va a chiamare la
exit()...
mi sembra fosse stato detto da uno del NG qualche post fa!
Dome
PS: Evitiamo il cross posting
--
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
PC Brain Official Web Site
http://digilander.iol.it/pcbrain
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-