Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di robott
    Registrato dal
    Apr 2009
    Messaggi
    20

    [C++] Prototipi di funzioni in libreria standard

    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:

    Codice PHP:
    #include <iostream>
    #include <stdlib.h>

    using namespace std;

    [
    B]double sqrt(double);[/B]

    int main()
    {

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


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

    Codice PHP:
    #include <iostream>
    #include <stdlib.h>
    [B]#include <cmath>[/B]

    using namespace std;

    int main()
    {

        
    int a 49;
        
    int b sqrt(a);
        
    cout << "La radice e' " << << 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?

  2. #2

    Re: [C++] Prototipi di funzioni in libreria standard

    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di robott
    Registrato dal
    Apr 2009
    Messaggi
    20
    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!

  4. #4
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di robott
    Registrato dal
    Apr 2009
    Messaggi
    20
    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!

  6. #6
    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!
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di robott
    Registrato dal
    Apr 2009
    Messaggi
    20
    Perfetto! =D

    Grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.