Δημοσιεύτηκε: 26 Ιουν 2011, 04:07
από migf1
Ξεκινώντας από το δεύτερο, τα <stdio.h> κλπ δεν είναι βιβλιοθήκες (κακώς χρησιμοποιείται αυτός ο όρος στα Ελληνικά), είναι header files, τα οποία περιέχουν μέσα τους σταθερές, ορισμούς καθολικών μεταβλητών & δομών δεδομένων που έχουν χρησιμοποιηθεί για τη δημιουργία της εκάστοτε βιβλιοθήκης.

Δεν είναι όμως απαραίτητο να αναφέρονται υποχρεωτικά σε βιβλιοθήκες. Μπορείς κι εσύ να φτιάξεις δικά σου header files με σταθερές, ορισμούς, κλπ που σκοπεύεις να χρησιμοποιήσεις σε περισσότερα του ενός .c αρχείου (αν δλδ το πρόγραμμά σου αποτελείται από πολλά .c αρχεία), προσθέτοντας τη γραμμή: #include "myheader.h" (τα "", αντί για <>, λένε στον compiler να ψάξει για το header file πρώτα στον ίδιο φάκελο που υπάρχουν τα .c αρχεία του προγράμματος, κι αν δεν το βρουν εκεί τότε να το αναζητήσουν στο standard INCLUDE path.

Σου παραθέτω 3 links που εξηγούν περί header files: link-1, link-2, link-3

(αν δεις τον κώδικα της Ξερής στο άλλο νήμα, χρησιμοποιώ κι εγώ εκεί δικά μου header files, τα οποία τα καλώ σε όποιο .c τα χρειάζομαι).

Οι βιβλιοθήκες τώρα, είναι συλλογές από object files (.o στον gcc) που παράγει ο compiler για κάθε πηγαίο αρχείο .c, πριν παράξει το τελικό εκτελέσιμο αρχείο. Οι συλλογές αυτές στον gcc γίνονται archived σε ένα αρχείο .a με το εργαλείο ar και πρέπει πάντα να ξεκινάνει το όνομά του με "lib" (δες εδώ ένα mini-tutotial: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html).

Αν μια βιβλιοθήκη σου (library) την έχεις ονομάσει για παράδειγμα: libmine.a, τότε για να τη συμπεριλάβεις στο compilation του κώδικά σου, προσθέτεις στη γραμμή εντολών του gcc το flag -l ακολουθούμενο ΚΟΛΛΗΤΑ από το όναμα της βιβλιοθήκης σου, ΧΩΡΙΣ το "lib" και το ".a". Δηλαδή: gcc blabla -lmine, με την προϋπόθεση πως έχεις βάλει το αρχείο: libmine.a στο LIB path του shell σου (αλλιώς θα πρέπει στη γραμμή του gcc να δώσεις και το path στο οποίο βρίσκεατι η βιβλιοθήκη σου. Δες εδώ αναλυτικά tutorials: 1. http://www.crasseux.com/books/ctutorial ... #Libraries 2. http://www.crasseux.com/books/ctutorial ... brary.html)

Η διαδικασία και οι ονομασίες δεν είναι ίδια σε όλους τους compilers! Σχετικό-Άσχετο: τα αρχεία .dll που βλέπεις στα Windows είναι βιβλιοθήκες ;)

Τώρα, σε ότι αφορά το που δείχνει ο δείκτης ptr. Είναι δείκτης σε μεταβλητές του πρόσθετου τύπου FILE (που ουσιαστικά είναι ένα struct που ορίζεται μέσα στο στάνταρ header file <stdio.h>). Αντί π.χ. να είναι pointer of int, είναι pointer of struct _iobuf (στον mingw) το οποίο struct με τη σειρά του έχει οριστεί μέσα στο <stdio.h> με την εντολή typedef να είναι πρόσθετος τύπος δεδομένων (custom data type) με την ονομασία FILE.

Επί της ουσίας δεν σε ενδιαφέρει πως ακριβώς έχει οριστεί το struct, αφού όπως σου είπα κάθε compiler το ορίζει διαφορετικά μέσα στο <stdio.h> του. Εσένα σε ενδιαφέρει πως υπάρχει σε όλους τους compilers και υλοποιεί πρόσβαση σε αρχεία, μέσω οποιουδήποτε δείκτη ορίσεις να είναι δείκτης σε FILE.