PDA

Visualizza la versione completa : [c] include


Lucked
12-08-2008, 14:12
Ciao a tutti, non mi è molto chiaro come si dividono i programmi in piu file, cioè l'aspetto dei file inclusi.
In particolare mi chiedevo se le dichiarazioni delle funzioni devono andare in un unico file da includere, oppure nello stesso file dovrei metterci anche le funzioni dentro. In genere come si fa?

gp.maraldo
12-08-2008, 15:06
Volendo puoi mettere le funzioni nello stesso
file delle dichiarazioni, ma è meglio separarle.
In genere si crea un file .h con le dichiarazioni
e un file .c con il codice delle funzioni, che
richiama l'header.

Esempio:

file prova.h:


int quadrato(int num);
int cubo(int num);

file prova.c:


#include "prova.h"

int quadrato(int num){

return num*num;
}

int cubo(int num){

return num*num*num;
}

file principale:


#include "prova.h"
...
int main(){
...
x=quadrato(y);
...
}

gp.maraldo
12-08-2008, 15:20
... un altra cosa:

nel file .h è consigliato usare:


#ifndef
#define
...
#endif

per evitare di compilare più volte le stesse cose,
che potrebbe creare problemi.
Quindi il codice sarebbe qualcosa del genere:

File prova.h


#ifndef ProvaSuPiuFile
#define ProvaSuPiuFile

int quadrato(int num);
int cubo(int num);

#endif

Lucked
12-08-2008, 20:07
ciao grazie mille,
n prova.c potevi fare a meno di mettere: #include "prova.h" ? perchè ho provato ora con un programma e non mi da alcun errore. :ciauz:

gp.maraldo
12-08-2008, 23:19
Si, funziona, perchè era giusto un esempio semplice.
In genere, nel file .h si inseriscono definizioni di macro
o di strutture o altro che il file .c utilizzerà, senza deverle
ridichiarare.

esempio:

prova.h

...
#define MAX_UTENTI 100
...

prova.c


#include "prova.h"
...
if (totale<MAX_UTENTI){
...


In questo caso l'include serve, perchè altrimenti, nel file .c
non avresti accesso a MAX_UTENTI. Questo è utile, perchè
così basta leggere e modificare l'header (in genere più leggibile
del file .c in cui a volte non si ha proprio accesso), per avere
effetti anche sul file .c.

MacApp
13-08-2008, 04:27
io invece ti consiglio di mettere le dichiarazioni extern nei .h, i prototipi e le definizioni nei .c. Ad esempio:


/*
* main.c
*/

/*
* Fast include trick
*/

#ifndef UHelloWorld_h
#include "UHelloWorld.h"
#endif

int main (void){
IGShowHelloWorld ();
return 0;
}




/*
* UHelloWorld.h
*/

#ifndef UHelloWorld_h
#define UHelloWorld_h

/*
* Fast include trick
*/

#ifndef UHelloWorld_h
#include "UHelloWorld.h"
#endif

/*
* Dichiarazione extern (che significa: dichiarata altrove)
*/

extern void IGShowHelloWorld (void);

#endif




/*
* UHelloWorld.c
*/

#include <stdio.h>

/*
* Fast include trick
*/

#ifndef UHelloWorld_h
#include "UHelloWorld.h"
#endif

/*
* Prototipo o dichiarazione
*/

void IGShowHelloWorld (void);

/*
* Definizione
*/

void IGShowHelloWorld (void){
(void) printf ("Hello World!\n");
}



Compilato e testato con:


i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)

Compilazione (zero errori, zero warning):


$ gcc -Wall -ansi -pedantic main.c UHelloWorld.c

output:


Hello World!

gp.maraldo
13-08-2008, 11:20
A cosa servono tutti quei #ifndef UHelloWorld_h?

Non è sufficiente metterne uno nel file .h, cosi chiunque
lo richiami, verrà effettuato un controllo?

E nel file .h che senso ha:

#ifndef UHelloWorld_h
#define UHelloWorld_h

#ifndef UHelloWorld_h
#include "UHelloWorld.h"
#endif

extern void IGShowHelloWorld (void);

#endif

non è la stessa cosa di:

#ifndef UHelloWorld_h
#define UHelloWorld_h

extern void IGShowHelloWorld (void);

#endif

:master: :confused:

gp.maraldo
13-08-2008, 11:45
Lo specificatore extern per una dichiarazione
di una funzione è ridondante.

cioè

#ifndef UHelloWorld_h
#define UHelloWorld_h

extern void IGShowHelloWorld (void);

#endif

è identico a:

#ifndef UHelloWorld_h
#define UHelloWorld_h

void IGShowHelloWorld (void);

#endif

extern è importante per le variabili.

Comunque sono daccordo con MacApp: è una buona cosa l'extern
nei file .h (per le variabili) dichiarate nei file .c

MacApp
13-08-2008, 12:18
L'apparente ridondante "fast include trick" come si può intuire dal commento stesso, serve appunto per aiutare in velocità di compilazione il compilatore: non necessita di aprire il file per verificare che lo ha già incluso. E per sveltire il copia incolla.

;-)

gp.maraldo
13-08-2008, 12:43
Ok,
capisco nel file .c, ma a cosa serve nel file .h?
:bhò:

Loading