Newsgroup: it.comp.lang.c++
Titolo: Definizione di una variabile "nascosta"

Salve a tutti,
mi sto chiedendo se esiste qualche tecnica che mi permetta di
definire, all'interno di uno spazio di visibilità (scope), una
variabile "apparentemente" senza nome (che quindi non interferisca con
variabili con lo stesso nome nello stesso scope o in uno scope
esterno) che venga distrutta in uscita dallo scope e non nel punto in
cui viene definita.
Mi spiego meglio con un esempio:
#include <iostream>
//#define DUMP_DEBUG
#if defined(DUMP_DEBUG)
class CDumpInizioFineOperazione
{
   const char *m_psz;
public:
   explicit CDumpInizioFineOperazione(const char *psz):m_psz(psz)
   {
      std::cout << "*** INIZIO " << m_psz << std::endl;
   }
   ~CDumpInizioFineOperazione()
   {
      std::cout << "*** FINE " << m_psz << std::endl;
   }
};
#endif
int main()
{
   //Operazione 1
   {
#if defined(DUMP_DEBUG)
      CDumpInizioFineOperazione tmp("Operazione 1");
#endif
      std::cout << "esegui operazione 1" << std::endl;
   }
 
   std::cout << std::endl;
   //Operazione 2
   {
#if defined(DUMP_DEBUG)
      CDumpInizioFineOperazione("Operazione 2");
#endif
      std::cout << "esegui operazione 2" << std::endl;
   }
   std::cout << std::endl;
   //Operazione 3
   {
#if defined(DUMP_DEBUG)
      CDumpInizioFineOperazione tmp("Operazione 3");
#endif
      std::cout << "esegui operazione 3" << std::endl;
      int tmp;
   }
 
   std::cout << std::endl;
   //Operazione 4
   int tmp;
   {
#if defined(DUMP_DEBUG)
      CDumpInizioFineOperazione tmp("Operazione 4");
#endif
      std::cout << "esegui operazione 4" << std::endl;
      tmp = 1;
   }
 
  return 0;
}
La parte indicata con "operazione 1" produce in output:
*** INIZIO Operazione 1
esegui operazione 1
*** FINE Operazione 1
ed ha il comportamento da me desiderato ma utilizza una variabile
La parte indicata con "operazione 2" utilizza una variabile temporanea
senza nome per cui il costruttore e distruttore vengono chiamati prima
dell'istruzione successiva
	std::cout << "esegui operazione 2" << std::endl;
L'output in questo caso è:
*** INIZIO Operazione 2
*** FINE Operazione 2
esegui operazione 2
Le parti "Operazione 3" e "Operazione 4" (CHE NON COMPILANO!!!)
mostrano perchè la tecnica in "Operazione 1" non è utilizzabile.
Grazie.
Marco.
-- 
 
For direct reply change underscore to dot

 cui viene definita.
Non credo che esista una soluzione generale a questo problema.
Normalmente si cerca di usare nomi di variabile che non possano 
difficilmente provocare ambiguita', come nel seguente esempio:
    //Operazione 5
    {
       #if defined(DUMP_DEBUG)
       CDumpInizioFineOperazione DumpInizioFineOperazione(
          "Operazione 5");
       #endif
       std::cout << "esegui operazione 5" << std::endl;
    }
    std::cout << std::endl;
Per i casi in cui il codice durante il quale deve essere viva la 
variabile sia una sequenza di espressioni, si possono sostituire i 
separatori ';' con l'operatore ',', come nel seguente esempio:
    //Operazione 6
    {
#if defined(DUMP_DEBUG)
       CDumpInizioFineOperazione("Operazione 6"),
#endif
       std::cout << "esegui ",
       std::cout << "operazione 6" << std::endl;
    }
    std::cout << std::endl;
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila