PDA

Visualizza la versione completa : [C++] Ifndef, endif e condizione


ar146
18-05-2012, 17:39
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?


#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:


#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

Scara95
18-05-2012, 17:53
Serve ad includere il codice una sola volta, se è già stato incluso lo salta...

Who am I
18-05-2012, 18:09
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.

MItaly
18-05-2012, 18:37
http://en.wikipedia.org/wiki/Include_guard

ar146
18-05-2012, 19:07
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?

Kaamos
18-05-2012, 19:17
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.

Loading