Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    27

    [C++] Ifndef e endif

    Ragazzi, ho un listato che crea un archivio di studenti, però non riesco a capire perchè viene usato ifndef, quale sarebbe la condizione da far verificare al preprocessore?

    codice:
    #ifndef _STUDENTE_
    #define _STUDENTE_
    
    #include <iostream>
    using namespace std;
    
    const int size=20;
    
    typedef struct Studente {
      char nome[size];
      int  matricola;
      int numeroEsami;
    };
    
    void  crea_record(Studente &);
    
    #endif
    Questo è il file Archivio.cpp se può essere d'aiuto:
    codice:
    #include "Archivio.h"
    
    Archivio  crea_archivio(int & dim, int& num) {
      
      cout << "\n Quante entry ha l'archivio?";
      cin >> dim;
      Archivio t=new Studente[dim];
      num=0;
      return t;
    }
    
    bool  inserisci_record(Archivio t, int & num, const Studente s, const int n) {
      bool ok=true;
      if (num<n && t!=0) {
      t[num]=s;
      num++;    
      }
      else ok=false;
      return ok;
    }
    
    bool  ricerca_record(const Archivio t, const int m, const int num, int & pos) {
        
        bool trovato=false;
        int i=0;
        while(i<num && !trovato)
          if(m==t[i].matricola) {
              trovato=true;
              pos=i;
          }    
          else i++;
        return trovato;  
    }    
        
    
    void stampa_archivio(const Archivio t, const int num){
      if(t==0 || num==0) cout << "L'archivio è vuoto o non esiste";
      else
      for (int i=0; i<num; i++) {
        cout << "\n";
        cout << "\n" << i;
        cout << "[" << t[i].matricola << ','<< t[i].nome << ',' << t[i].numeroEsami << "]" << endl;
      }
    }
    
    void  stampa_dati(const Archivio t, const int pos, const int n, const int num) {
       if(pos >num || pos<0 || pos>n) cout << "\n posizione record non valida!"; 
       else
       cout << "\n [" << t[pos].matricola << ','<< t[pos].nome << ',' << t[pos].numeroEsami << "]" << endl;
        
    }    
    
    void  distruggi_archivio(Archivio & t, int & num, int & n)  {
      delete [] t;
      t=0;
      n=0;
      num=0;
    }
    
    void  crea_record(Studente & s){
        cout << "\n ******** Inserimento dati studente ********";
        cout << "\n Inserisci il numero di matricola: ";
        cin >> s.matricola;
        cin.ignore(); 
        cout << "\n Inserisci nome e cognome: ";
        cin.getline(s.nome,size);
        cout << "\n Inserisci il numero di esami: ";
        cin >> s.numeroEsami;
    }
    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Serve ad includere il codice una sola volta, se è già stato incluso lo salta...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    Re: [C++] Ifndef e endif

    Originariamente inviato da ar146
    Ragazzi, ho un listato che crea un archivio di studenti, però non riesco a capire perchè viene usato ifndef, quale sarebbe la condizione da far verificare al preprocessore?
    Il pre-processore verifica che la macro _STUDENTE_ non sia già stata definita.
    Se non esiste compila il codice che è stato scritto dopo la direttiva define e prima della direttiva endif, altrimenti non compila quel codice che potrebbe essere problematico in quanto definirebbe variabili e nomi di funzioni già definiti.

  4. #4
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    27

    ok tutto chiaro

    ma dove la usa poi questa macro? altrimenti che l'ha creata a fare?

    quindi ifndef controlla che io possa aver definito la macro studente negli altri file relativi al progetto, giusto?

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: ok tutto chiaro

    Originariamente inviato da ar146
    ma dove la usa poi questa macro? altrimenti che l'ha creata a fare?

    quindi ifndef controlla che io possa aver definito la macro studente negli altri file relativi al progetto, giusto?
    Non deve usarla, deve solo vedere se è definita o no: la prima volta che proverà a compilare quel file l'ifndef avrà esito positivo (perché non è stata ancora definita), quindi la definirà e proseguirà col codice fino all'endif.
    Se quel file verrà nuovamente incluso da un altro file, questa volta l'ifndef avrà esito negativo e il codice fino all'endif non verrà considerato.

    Non controlla che tu l'abbia definita negli altri file (non avrebbe senso definire quell macro in altri file), controlla solo che quell'header non venga incluso più volte.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.