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???
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???
By Games
La direttiva
#ifndef NOME
...
...
...
#endif
fa si che se NOME non è definito allora viene considerato il codice compreso tra ifndef e endif; se NOME è già definito il codice compreso tra ifndef e endif non è considerato, e come se non esistesse.
Uno dei casi in cui si usa tale direttiva è per racchiudere un file header .h. Se in c/c++ definisci 2 volte la stessa funzione il compilatore di dà un errore, quindi bisogna evitare ciò. Come sai per utilizzare delle funzioni o delle classi gia definite in genere si importa nel programmail relativo file header con la direttiva
#include<....>
ad esempio:
#include <stdlib.h>
Quando il preprocessore incontra tale direttiva no fa altro che inserire tutto il codice che è nel file stdlib.h nel file corrente. Quello che potrebbe succedere è che tu includa i files a.h e b.h, ma a sua volta b.h include a.h e quindi avresti che tutte le definizioni contenute in a.h sarebbero incluse due volte, generando un errore. Se però le definizioni sono immerse nella direttiva #ifndef si puo definire una macro in modo da includere le definizioni una sola volta, esempio:
************ FILE a.h ***************
#ifndef A_H //Se non è definito A_H
#define A_H //definisco A_H e considero tutto il codice fino all'endif
...
...varie definizioni
...
....
#endif
***************************
Se b.h include a.h e nel tuo programma scrivi:
#include <a.h>
#include <b.h>
allora con la prima direttiva viene incluso a.h e viene definito il simbolo A_H; quando poi si include b.h, siccome A_H è gia stato definito l'ifndef non è eseguito e quindi a.h no nviene incluso una seconda volta.
![]()
guarda un po questo programma:
codice:Parte del main: #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;codice://prova oggetti.cpp #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; }Nel libro c'è scritto che queste direttive evitano di includere più volte il file di intestazione.codice://Definizione della classe Time #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
Ma in che senso?
In questo programma non riesco a capirlo
Ho provato a levare le direttive e funge lo stesso
By Games
Il senso e quello che ti ho spiegato prima, se per esempio iostrem a suo volta include time1.h, questo sarebbe incluso 2 volte, una volta perke lo includi direttamente nel programma, una seconda volta perche e gia incluso in iostream. Lo so che puo funzionare uguale, pero in genere potrebbe non funzionare.