Visualizzazione dei risultati da 1 a 4 su 4

Discussione: C++ e preprocessore

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    327

    C++ e preprocessore

    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

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.


  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    327
    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;
    }
    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
    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
    By Games

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.