PDA

Visualizza la versione completa : Linguaggio C. Direttive del preprocessore?


line89
26-01-2014, 22:27
Salve sto iniziando a studiare il programma C ed non ho capito bene una cosa, le direttive del processore. Da quello che ho capito io le direttive del preprocessore sono dei speciali commandi con i quali si dice al preprocessore di fare delle azioni specifiche sul file sorgente c prima che esso venga compilato, giusto? il commando #include <stdio.h> scritto in un file in c, permette al preprocessore di capire a quale funzioni delle librerie standard del c, si deve fare riferimento. Ovvero, il preprocessore inserisce l' indirizzo della funzione (la quale è in una directory predefinita, dato che il nome della funzione predefinita e racchiusa tre <>), che al momento della compilazione del file c, esso sarà un tuttuno con la funzione predefinita stdio.h, sbaglio?

MItaly
26-01-2014, 23:55
Non è proprio così.

Il precompilatore fa semplicemente operazioni "di testo"; #include dice al compilatore di fare un brutale copia-incolla del testo contenuto di stdio.h (contenuto in una directory particolare specifica del compilatore). In stdio.h sono contenute le dichiarazioni (=i prototipi) delle funzioni di libreria, che dicono al compilatore che le funzioni in questione esistono e hanno quel determinato prototipo. Come in qualunque altro caso in cui si compilano più file, al momento di compilare il singolo .c il compilatore lascia un "segnaposto" nel modulo oggetto generato per le funzioni dichiarate ma non definite (come quelle di libreria). Al momento di generare l'eseguibile, il linker tira le fila della questione, linkando i tuoi moduli oggetto, oltre che tra di loro, anche con la libreria standard C, sistemando così tutti questi riferimenti lasciati in sospeso.

line89
29-01-2014, 12:07
Ciao MItaly, quindi il compilatore possiede solo i prototipi delle funzioni predefinite della libreria c. Perciò la definizione di queste funzioni predefinite non sta tra le directory del compilatore. Inoltre vuoi dire che quando il codice viene compilato in assembly, il compilatore ha lasciato dei segnaposti per indentificare i prototipi di funzione. Poi il linker in base ai segnaposto, presenti nel codice oggetto(codice assembly generato dal compilatore e poi successivamente tradotto in linguaggio macchina dall' assembler) copia in essi gli indirizzi dei luoghi dove sono definiti i prototipi di funzione, e quindi si genera l' eseguibile.

MItaly
30-01-2014, 22:13
Esatto. :ciauz:

Loading