PDA

View Full Version : [C++]Problema con 2 preprocessori


Gogeta ss4
25-05-2004, 19:03
Ciao raga, non riesco a capire a cosa servono e come si usano queste direttive al preprocessore: #ifndef #endif

Chi me le può spiegare cortesemente e fare anche un esempio please???

fpucci
25-05-2004, 20:38
Le direttive da te indicate servono per fare delle "compilazioni condizionate".
Ad esempio, sepponiamo che tu abbia definito:


#define _DEBUG_


allora, nel corso del tuo programma, potresti fare:

#ifdef _DEBUG_
printf ("***** DEBUG - NomeProcedura() - Var1=%d\n", Var1);
#endif


E quella istruzione (la printf()) verrà compilata SOLO SE avrai definito (#ifdef) la variabile da te specificata (_DEBUG_)

Analogo discorso per la direttiva #ifndef.
#ifndef _DEBUG_
printf ("***** DEBUG - NomeProcedura() - Var1=%d\n", Var1);
#endif
[/code]
In questo caso, la printf() verrà compilata solo se _DEBUG_ non è stata precedentemente definita (tra,ite la #define)

La direttiva #endif serve per chiudere il blocco di #ifdef o #ifndef.

Gogeta ss4
25-05-2004, 20:56
Guarda che questi 3 file:


#include <iostream.h>
#include "time1.h"
int main()
{
time t; //Oggetto alla classe time
cout <<"\nL'ora militare e': ";
t.printmilitary();
cout <<"\nL'ora standard e': ";
t.printstandard();
t.settime(13,50,20);
cout <<"\nDopo il set-time l'orario militare e' questo: ";
t.printmilitary();
cout <<"\nDopo il set-time l'orario standard e' questo: ";
t.printstandard();
t.settime(90,70,80);
cout <<"\nHo immesso valori alti al set-time: ";
cout <<"\nOra Militare: ";
t.printmilitary();
cout <<"\nOra standard: ";
t.printstandard();
cout <<endl;
cin.get();
return 0;
}



#include <iostream.h>
#include "time1.h"

time::time()
{
ora=minuti=secondi=0; //Inizializzo tramite costruttore i membri a 0
}

void time:: printmilitary()
{
cout<<(ora<10 ? "0":"") <<ora <<":" <<(minuti<10 ? "0":"")
<<minuti;
}

void time:: printstandard()
{
cout<<((ora==0 || ora==12) ? 12: ora%12) <<":"
<<(minuti<10 ? "0":"") <<minuti <<":"
<<(secondi<10 ? "0":"") <<secondi
<<(ora<12 ? "AM":"PM");
}

void time::settime(int h,int m,int s)
{
ora=(h>=0 && h<24) ? h:0;
minuti=(m>=0 && m<60) ? m:0;
secondi=(s>=0 && s<60) ? s:0;
}



#ifndef TIME1_H
#define TIME1_H
class time
{
public: time();
void printmilitary();
void printstandard();
void settime(int,int,int);
private: int ora;
int minuti;
int secondi;
};

#endif


Nel libro c'è scritto che queste direttive evitano di includere più volte il file di intestazione.
Ma in che senso?
In questo programma non riesco a capirlo

Ho provato a levare le direttive e funge lo stesso

ilsensine
26-05-2004, 09:38
Originariamente inviato da Gogeta ss4

#ifndef TIME1_H
#define TIME1_H
<...>
#endif


Nel libro c'è scritto che queste direttive evitano di includere più volte il file di intestazione.
Ma in che senso?

Sono i cosiddetti include guard. Evitano appunto che una dichiarazione venga fatta più volte, in quanto alcuni compilatori potrebbero non accettarla. Questo può capitare ad es. se includi il file a.h, quindi un secondo file b.h che include esso stesso a.h.