PDA

Visualizza la versione completa : [C++] Prototipi di funzioni in libreria standard


robott
24-12-2009, 14:59
Salve :)
Mi sono stupito del fatto che per utilizzare la funzione sqrt() della lib. standard si pu anche non includere l'header che contiene l'implementazione della funzione.
Basta che si inserisca il prototipo di questa:



#include <iostream>
#include <stdlib.h>

using namespace std;

double sqrt(double);

int main()
{

int a = 49;
int b = sqrt(a);
cout << "La radice e' " << b << endl;
system("PAUSE");
return 0;

}

Io pensavo si dovesse necessariamente includere l'header in questa maniera:



#include <iostream>
#include <stdlib.h>
#include <cmath>

using namespace std;

int main()
{

int a = 49;
int b = sqrt(a);
cout << "La radice e' " << b << endl;
system("PAUSE");
return 0;

}


Se non ho capito male gli header tratti dalla libreria std non sono altro che file che contengono l'implementazione delle classi. Io le includo e queste divengono visibili all'interno del mio file.
Se io non includo la libreria come fa a capire dove richiamarsi l'implementazione della funzione?
Le librerie std sono sempre visibili?

MItaly
24-12-2009, 17:43
Originariamente inviato da robott
Se non ho capito male gli header tratti dalla libreria std non sono altro che file che contengono l'implementazione delle classi. Io le includo e queste divengono visibili all'interno del mio file.
Non cos semplice. In generale gli header C contengono solo prototipi (e qualche macro), per cui le funzioni in questione diventano visibili nel tuo file, ma non ne viene ancora fornita l'implementazione. Quando il compilatore vede che utilizzi una funzione di cui c' solo il prototipo (come accade per le funzioni della libreria standard) segna nel modulo oggetto un promemoria per il linker che dice una cosa del tipo "qui il programma richiama la funzione TalDeiTali; pensaci tu". Quando poi il programma viene linkato, il linker prende tutti i moduli oggetto del tuo programma e la libreria statica della CRT e li collega insieme, sistemando tutti questi riferimenti non ancora risolti. Buona parte delle funzioni della CRT, quindi si trovano nella libreria statica della CRT (di solito poi ne esistono diverse versioni, ma ora questo non ci importa).
Con i template per la questione diventa pi complicata dato che, almeno per quanto riguarda i compilatori attuali, non possono essere inclusi in librerie statiche, per cui gli header della libreria standard che vai ad includere che forniscono classi template ne forniscono anche tutta l'implementazione.

robott
26-12-2009, 02:13
Ti ringrazio! :)

Ho preso consapevolezza che il mio libro tratta abbastanza superficialmente la questione delle librerie.
Adesso cerco qualcosa in internet, s che esiste una miriade di cose ma la qualit quella che non altrettanto abbondante. Se avete qualche cosa da suggerire in modo particolare sarebbe ben accetta.

Comunque per adesso possiamo confermare che il linker anche se non ha nessun include specifico si fa sempre una ricerchina nelle CRT se ha qualche prototipo che potrebbe trovare l.

Grazie ancora! :ciauz:

MItaly
26-12-2009, 02:26
Originariamente inviato da robott
Comunque per adesso possiamo confermare che il linker anche se non ha nessun include specifico si fa sempre una ricerchina nelle CRT se ha qualche prototipo che potrebbe trovare l.

Non so se hai scritto male o io capisco male quello che hai scritto, nel dubbio comunque preciso: il linker non va a cercare prototipi, ma implementazioni di funzioni che il compilatore gli ha lasciato come riferimenti non risolti. Alcuni compilatori (gcc in particolare) poi sottointendono alcune dichiarazioni di libreria standard, ma quello non un comportamento standard.

robott
26-12-2009, 14:07
Originariamente inviato da MItaly
Non so se hai scritto male o io capisco male quello che hai scritto, nel dubbio comunque preciso: il linker non va a cercare prototipi, ma implementazioni di funzioni che il compilatore gli ha lasciato come riferimenti non risolti. Alcuni compilatori (gcc in particolare) poi sottointendono alcune dichiarazioni di libreria standard, ma quello non un comportamento standard.

A me quello che non tornava era che il compilatore senza che io specificassi niente fosse in grado di trovarsi l'implementazione della funzione di cui scrivevo il prototipo.
Ma alla luce di quanto detto questo "normale" per le funzioni della libreria standard! :)

MItaly
26-12-2009, 16:12
Originariamente inviato da robott
A me quello che non tornava era che il compilatore senza che io specificassi niente fosse in grado di trovarsi l'implementazione della funzione di cui scrivevo il prototipo.
Ma alla luce di quanto detto questo "normale" per le funzioni della libreria standard! :)
Come detto, nulla di speciale, nel modulo oggetto vengono specificate come riferimenti non risolti e il linker ne trova l'implementazione nella libreria della CRT.
Ciao!

robott
26-12-2009, 16:26
Perfetto! =D

Grazie! :)

Loading