Linuxtrent: Re: Dubbio di forma (programmando in C)

  • From: Lele Gaifax <lele@xxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxxxxxx
  • Date: Wed, 2 May 2001 11:00:24 +0200

>>>>> On Tue, 1 May 2001 19:03:37 +0200, Mario Torre <mario.torre@xxxxxxxxxxxx> 
>>>>> said:

    MT> On Friday 20 April 2001 17:50, Lele Gaifax wrote:
    AC> stesso modulo =
    >>  Pur essendo contrario di principio alle variabili locali,
    >> credo siano molto adatte a questo scopo:
    >> <snip>

    MT> Con un poco di ritardo...

    MT> Non e' come lavora la variabile errno della libreria standard
    MT> del C?

Si, certo: in quel caso si usa appunto una variabile globale, con la
sua facilità d'uso e comprensione, ma anche con la sua "staticità":
rende impossibile fare alcune cose, come modificare la gestione degli
errori (immagina di voler fare un log di ogni errore di un certo
tipo...).

Al contrario, utilizzando una coppia di funzioni SetError/GetLastError
avrai la possibilità di definire delle macro in C, che ad esempio
segnalino *anche* in che funzione e linea, tipo

#define SetError(code) { (SetError)(code); \    
                         set_error_location (__FILE__, __LINE__); }

che maschera la funzione `SetError' con una macro, che non fa altro
che eseguire la vera funzione e chiamarne un'altra per memorizzare la
posizione dell'errore...

Oppure agire in modo particolare quando il tuo codice, per qualche
motivo, andasse a "sovrascrivere" una condizione di errore senza
averla letta:

void MySetError (int code)
{
  if ((code <> 0) && (GetLastError() <> 0)) EsprimiDisagio (...);
  SetError (code);
}

int MyGetLastError()
{
  int e = GetLastError();

  if (e <> 0)
    MySetError (0);

  return e;
}

#define SetError(e) MySetError(e)
#define GetLastError MyGetLastError

Spero di aver chiarito la versatilità del metodo...

ciao, lele.
--
nickname: Lele Gaifax   | Quando vivro' di quello che ho pensato ieri
real: Emanuele Gaifas   | comincero' ad aver paura di chi mi copia.
email: lele@xxxxxxxxxx  |               -- Fortunato Depero, 1929.

-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con SOGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxxxxxx


Other related posts: