PDA

Visualizza la versione completa : [C]creare file .h, .o e includerli in un programma


deleted_129
13-12-2012, 20:18
Salve a tutti...oggi ho avuto lezione di informatica (linguaggio C)...non ho capito bene alcune cose...sopratutto per colpa del mio compilatore....io uso devc++...per creare file header basta creare il file e salvarlo .h ...il programma lo scrivo e lo salvo come .c....ma come faccio io a includere nel mio programma .c il mio file header ? (so che si fa con #include "esempio.h") ma non ho capito come funziona.....
es , prog.c:


#include <stdio.h>
#include "mialib.h"
int main(){
int x=5,y=3;
somma(x,y); /*somma e' una funziona che dovrebbe essere su mialib.h*/
return 0;
}


ora...nel file mialib.h devo mettere i protocolli delle funzioni che scrivo su mialib.c ...ma come si fa? e i file .o a che mi servono? pls aiutatemi con un esempio pratico magari...

pistilloi
13-12-2012, 20:52
Se includi mialib.h tra virgolette, il file header si deve trovane nella stessa directory di prog.c. I file oggetto sono i risultati della compilazione che una volta eseguito il linking delle librerie pronto ad'essere eseguito...


//mialib.h
int somma(int a, int b) { return a+b; }



// prog.c
#include <stdio.h>
#include "mialib.h"
int main()
{
int x=5,y=3;
printf("%d+%d=%d\t", a, b, somma(x,y) );
return 0;
}

deleted_129
13-12-2012, 21:18
grazie mille, ho capito tutto , solo 2 piccole domande.....sul file .h ho un protocollo..il codice della funzione dove va messo? seconda domanda, quindi io non faccio direttamente il file oggetto ma viene generato quando faccio 'compila' , no?

MItaly
13-12-2012, 21:22
Originariamente inviato da darkhero
grazie mille, ho capito tutto , solo 2 piccole domande.....sul file .h ho un protocollo..il codice della funzione dove va messo?
Prototipo, no protocollo... il codice della funzione va messo in un .c (in genere vanno a coppie: un file .c con l'implementazione e un .h con lo stesso nome con i prototipi), da aggiungere al progetto. Il compilatore poi compila singolarmente i vari .c generando i .o, che vengono linkati insieme dal linker producendo cos l'eseguibile finale.

deleted_129
13-12-2012, 21:31
si scusa , volevo dire prototipi....e come fa a sapere il file .h a quale file deve "agganciarsi" (cioe' come fa a capire in quale file ci sono quelle funzioni che lui ha come prototipi) ?

pistilloi
13-12-2012, 21:33
Allora, non si chiama protocollo bens prototipo di funzione. Nel tuo caso non necessario dichiarare il prototipo dal momento che la funzione stata definita prima d'essere usata. invece indispensabile in questo caso:


// prog.c
#include <stdio.h>

int somma( int, int ); //prototipo

int main()
{
int x=5,y=3;
printf("%d+%d=%d\t", a, b, somma(x,y) );
return 0;
}

#include "mialib.h"

deleted_129
13-12-2012, 21:38
oooooooook ho capito, ho anche fatto un esercizio....grazie mille sei stato chiarissimo :)

MItaly
13-12-2012, 21:39
Originariamente inviato da darkhero
si scusa , volevo dire prototipi....e come fa a sapere il file .h a quale file deve "agganciarsi" (cioe' come fa a capire in quale file ci sono quelle funzioni che lui ha come prototipi) ?
Non lo sa, n importante che lo sappia. Quando includi un .h dici al compilatore dell'esistenza di quelle funzioni (l'#include un semplice copia-incolla); il compilatore compila ogni .c separatamente, e quando vede che si fa riferimento a delle funzioni dichiarate (=ci sono i prototipi) ma non definite (=non c' il corpo della funzione) lascia un "promemoria" nel file oggetto generato. Il linker quindi prende tutti i moduli oggetto e li riunisce, legge questi "promemoria" e vede se le funzioni che non sono state trovate durante la compilazione sono definite in uno dei moduli oggetto che sta considerando; in caso positivo, il "promemoria" sostituito dal codice di chiamata a funzione, altrimenti ottieni un errore di undefined reference.

deleted_129
13-12-2012, 21:52
chiarissimo :) grazie, quindi e' come se alla fine fosse tutto un unico file dove all'interno c'e' il programma, i prototipi che sono dei promemoria , le funzioni e tutto....magari mi sono spiegato velocemente ma ho capito tutto cio' che mi avete spiegato, ho anche fatto degli esercizi e mi sono riusciti :) grazie mille :)

deleted_129
13-12-2012, 21:54
una cosa...mi sono accorto che se inserisco la libreria dopo la main...anche se non metto i prototipi il programma mi funziona...a che servono quindi i prototipi se mi funziona lo stesso?

Loading