Dove sono le definizioni di printf e scanf

di il
12 risposte

Dove sono le definizioni di printf e scanf

Salve a tutti,spulciando nel file stdio.h noto che ci sono i prototipi delle funzioni printf e scanf, ma non la loro definizione.
Dove sono realmente scritte le due funzioni?

PS. uso fetora 23 con compilatori GNU gcc e LLVM clang

12 Risposte

  • Re: Dove sono le definizioni di printf e scanf

    Sono compilate nelle librerie .so
    AGGIUNGO: vedi in particolare la slide 2
  • Re: Dove sono le definizioni di printf e scanf

    Innanzitutto grazie.
    dato che gcc e open source , non si potrebbe risalire al codice?
  • Re: Dove sono le definizioni di printf e scanf

    Certamente, basta cercare
    Tra l'altro, molto probabilmente, tra i pacchetti (rpm credo) della fedora potresti trovare le versioni con sorgenti...
    Ma... ti serve davvero andare a vedere come sono implementate printf() e scanf()? Credo che questi sorgenti abbiano scarso valore "educativo".
  • Re: Dove sono le definizioni di printf e scanf

    candaluar ha scritto:


    Certamente, basta cercare
    Tra l'altro, molto probabilmente, tra i pacchetti (rpm credo) della fedora potresti trovare le versioni con sorgenti...
    Ma... ti serve davvero andare a vedere come sono implementate printf() e scanf()? Credo che questi sorgenti abbiano scarso valore "educativo".
    adesso proverò a scaricare gli scr rpm dai repo.
    era giusto una curiosità, volevo vedere come la printf e la scanf rispettivamente stampano acquisiscono i dati (sempre se riesco a capirci qualcosa).
  • Re: Dove sono le definizioni di printf e scanf

    Non è codice banale per un principiante...
  • Re: Dove sono le definizioni di printf e scanf

    In linea di massima vfprintf.c
    da li risalì poi a scanf.
  • Re: Dove sono le definizioni di printf e scanf

    Notate la larga presenza di goto ... sarà anche la migliore soluzione in questo caso, ma quanto è brutto ...
  • Re: Dove sono le definizioni di printf e scanf

    oregon ha scritto:


    Notate la larga presenza di goto ... sarà anche la migliore soluzione in questo caso, ma quanto è brutto ...
    Avevo fatto caso al fatto che i sorgenti su linux (quelli che ho potuto vedere) sono pieni di goto, credo che questo sia uno dei classici casi in cui si prediligge l'efficienza alla "chiarezza" del programma.

    Anch'io sono andato a vedere un pò di sorgenti, non tanto per il codice in sè, ma piuttosto per vedere come sono strutturati (Idendazione, nome variabili, disposizione commenti ecc. ecc.)

    Ho solo "modificato" una sola funzione, la strlen.
    Ho creato una strlan() che funziona come la strlen, ma che conta pure il carattere '\0' .
    (a dire il vero ho solo aumentato i valori di return della strlen, quindi in realtà non conta il '\0' ma aumenta di uno la dimensione della stringa)
    cosi , ad esempio, posso utilizzartla sulle malloc che devono essere usate con strlen()+1 , o in tutti i casi che è utile contare pure quel carattere.
    Non sarà una cosa utilissima (altrimenti ci sarebbe pure la funzione stardard credo), ma l'ho fatto come pratica.

    Mi chiedevo: Modificare solo il valore del return (e anche i #ifndef #define iniziali per evitare che la vera strlen non fosse inclusa ) può portare a errori?
  • Re: Dove sono le definizioni di printf e scanf

    Se interessa realmente studiare l'implementazione della libreria standard in una runtime library, ci sono innanzi tutto due riferimenti fondamentali:
    • P. J. Plauger, "The Standard C Library", Prentice Hall PTR
    • David Hanson, "C Interfaces and Implementations", Addison-Wesley

    P. J. Plauger è il deus ex machina della Dinkum library, un nome che in genere dice pochissimo al 99,999% dei programmatori quadratici medi, ma che casualmente è la libreria di runtime adottata da decine di compilatori mainstream (e non). Quel testo è quindi l'equivalente del K&R per quanto riguarda la standard library e il C89.

    Studiare direttamente i sorgenti della variopinta galassia GNU non è assolutamente un buon viatico per chi inizia, a causa della pressoché totale assenza di commenti organici, delle numerose peculiarità del giurassico standard di codifica (che peraltro confligge con la codifica adottata nel kernel Linux, oltre ad essere in rotta di collisione con quasi ogni altro coding standard, da MISRA/C a NASA a quello del CERT...), e delle note tendenze a privilegiare la portabilità ed alla iperfetazione di features che impregnano l'intera filosofia di fondo del toolset GNU.
    Tra l'altro, parlando di portabilità vs prestazioni, in quasi ogni altra libreria di runtime classica (a fortiori in quelle destinate specificamente a piattaforme più interessanti dei soliti noiosi PC mainstream e device consumer low cost odierni) la quantità di Assembly inline e di moduli Assembly è enormente superiore rispetto alla glibc.

    Esistono peraltro numerose alternative "lightweight" alla glibc, molto semplificate, destinate ai balocchi consumer di cui sopra, con limitate risorse (spesso spacciati ottusamente per "embedded" ).

    Vale anche la pena di sottolineare che i sorgenti delle librerie e dei files di startup sono inclusi nella schiacciante maggioranza dei compilatori C/C++ umanamente reperibili, "proprietari" e non, fin dagli anni Ottanta (i.e. Borland C/C++ Application Framework): anche se curiosamente il programmatore quadratico medio sembra misteriosamente convinto del contrario, avendo evidentemente perso (o mai acquisito?) l'abitudine di leggere la documentazione e di dare un'occhiata alle directory dell'installazione del proprio compilatore.
  • Re: Dove sono le definizioni di printf e scanf

    @oregon, bisogna partire dal presupposto che GCC è compilabile per generare codice per tantissime architetture, cercano sempre di spremere l'ultimo clock dal codice. Non solo, spesso il goto semplifica il codice che altresì diventerebbe ancora più complesso da decifrare.
    Ultimamente rischio sempre di finire ad usare goto, sto realizzando una softUART(a breve nei miei repository) e senza goto il tempo mcu per bit è maggiore di 1us, significa che per inviare un byte perdo minimo 10us, per inviare la stringa "ciao mondo" perdo ben 100us... comunque sto cercando di evitarlo, non so se ci riuscirò.

    @Maw, come sempre mi stimoli la lettura, so già cosa comprare....
  • Re: Dove sono le definizioni di printf e scanf

    Grazie per le numerose risposte.
    Nei pacchetti delle distribuzioni ci sono 3 tipologie di pacchetti, quelli normali, quelli devel e quelli debug.
    Correggetemi se sbaglio, il DEVEL serve in fase di compilazione ad altri sorgenti, oppure servono anche ad altro?
  • Re: Dove sono le definizioni di printf e scanf

    Sostanzialmente i pacchetti -devel contengono tutto quello che serve per utilizzare nel proprio software una certa libreria .so (sostanzialmente header) e non solo il file .so. Ci potrebbero essere anche dei files .a, ovvero la libreria compilata staticamente (in pratica la somma dei .o).
    Vedi questo http://stackoverflow.com/questions/2358801/what-are-devel-packages
Devi accedere o registrarti per scrivere nel forum
12 risposte