| C Πρότυπη Βιβλιοθήκη |
| --- |
| 
* `<assert.h>`
* `<complex.h>`
* `<ctype.h>`
* `<errno.h>`
* `<fenv.h>`
* `<float.h>`
* `<inttypes.h>`
* `<iso646.h>`
* `<limits.h>`
* `<locale.h>`
* `<math.h>`
* `<setjmp.h>`
* `<signal.h>`
* `<stdarg.h>`
* `<stdbool.h>`
* `<stddef.h>`
* `<stdint.h>`
* `<stdio.h>`
* `<stdlib.h>`
* `<string.h>`
* `<tgmath.h>`
* `<time.h>`
* `<wchar.h>`
* `<wctype.h>`
 |
| π • σ • ε
 |

Στην πληροφορική, η **C πρότυπη βιβλιοθήκη** είναι μια πρότυπη (στάνταρ) συλλογή από αρχεία επικεφαλίδες και συναρτήσεις βιβλιοθήκης που υλοποιούν κάποιες κοινές λειτουργίες, όπως είσοδος/έξοδος και χειρισμό αλφαριθμητικών, στη C. 
Σε αντίθεση με άλλες γλώσσες όπως η COBOL, η Fortran και η PL/I, η C δεν περιλαμβάνει ενσωματωμένες δεσμευμένες λέξεις για αυτές τις λειτουργίες, και γι' αυτό σχεδόν όλα τα προγράμματα γραμμένα στη C βασίζονται στην πρότυπη βιβλιοθήκη για να λειτουργήσουν.

Σχεδίαση
--------

Τα βασικά χαρακτηριστικά κάθε συνάρτησης (όνομα, τύπος παραμέτρων, τύπος τιμής επιστροφής) περιλαμβάνονται σε ένα αρχείο που καλείται αρχείο επικεφαλίδα, αλλά η υλοποίηση των συναρτήσεων αυτών υπάρχει χωριστά σε ένα αρχείο βιβλιοθήκης. Τα ονόματα αυτών των αρχείων-επικεφαλίδων της πρότυπης βιβλιοθήκης έχουν πλέον τυποποιηθεί αλλά όχι και η οργάνωση των βιβλιοθηκών της. Η πρότυπη βιβλιοθήκη παρέχεται συνήθως μαζί με τον μεταγλωττιστή.
Επειδή όμως οι μεταγλωττιστές της C παρέχουν συχνά και επιπλέον λειτουργίες που δεν καθορίζονται από το πρότυπο ANSI C, οι πρότυπες βιβλιοθήκες των διαφόρων μεταγλωττιστών εμφανίζουν διαφορές μεταξύ τους.

Ιστορία
-------

Η γλώσσα προγραμματισμού C, πριν δημιουργηθεί κάποια πρότυπη μορφή της, δεν παρείχε ενσωματωμένες λειτουργίες όπως λειτουργίες εισόδου/εξόδου (Ε/Ε). Με τον καιρό οι κοινότητες χρηστών της C αντάλλασσαν μεταξύ τους ιδέες και υλοποιήσεις για αυτό που πλέον καλούμε **C πρότυπη βιβλιοθήκη** προκειμένου να παρέχεται αυτή η λειτουργικότητα που έλλειπε. Πολλές από αυτές τις ιδέες
ενσωματώθηκαν τελικά στον ορισμό του προτύπου της γλώσσας προγραμματισμού C.

Το Unix και η γλώσσα προγραμματισμού C δημιουργήθηκαν στα εργαστήρια της AT&T Bell στα τέλη της δεκαετίας 1960 και στις αρχές τις δεκαετίας 1970. Κατά την δεκαετία του 1970 η γλώσσα προγραμματισμού C έγινε πολύ δημοφιλής. Πολλά πανεπιστήμια και οργανισμοί άρχισαν να δημιουργούν δικές τους παραλλαγές της γλώσσας για τα δικά τους εγχειρήματα. Στις αρχές της δεκαετίας του 1980 άρχισαν να γίνονται εμφανή τα προβλήματα συμβατότητας που παρουσίαζαν οι διάφορες υλοποιήσεις μεταξύ τους. Το 1983 ο Αμερικανικός Εθνικός Οργανισμός Τυποποίησης (ANSI) δημιούργησε μια επιτροπή για να δημιουργήσει μια στάνταρ εκδοχή της γλώσσας που 
έγινε γνωστή σαν "ANSI C". Αυτή η εργασία κορυφώθηκε με την δημιουργία του αποκαλούμενου **C89** στάνταρ το 1989. Μέρος του προτύπου που προέκυψε ήταν και ένα σύνολο **βιβλιοθηκών** που καλείται **ANSI C πρότυπη βιβλιοθήκη**.

Μετέπειτα αναθεωρήσεις του προτύπου της C πρόσθεσαν αρκετά νέα αρχεία επικεφαλίδες στην βιβλιοθήκη. Η υποστήριξη γι' αυτές τις επεκτάσεις διαφέρει από υλοποίηση σε υλοποίηση.

Τα αρχεία επικεφαλίδες **<iso646.h>**, **<wchar.h>**, και **<wctype.h>** προστέθηκαν με το Κανονιστική τροποποίηση 1 (Normative Amendment 1) (**NA1**), που αποτελούσε προσθήκη στο πρότυπο της C που επικυρώθηκε το 1995.

Τα αρχεία επικεφαλίδες **<complex.h>**, **<fenv.h>**, **<inttypes.h>**, **<stdbool.h>**, **<stdint.h>**, και **<tgmath.h>** προστέθηκαν με το πρότυπο **C99**, που ήταν μια αναθεώρηση του προτύπου της C που δημοσιεύθηκε το 1999.

Πρότυπο ANSI
------------

Η ANSI C πρότυπη βιβλιοθήκη αποτελείται από 24 αρχεία επικεφαλίδες της C, τα οποία μπορούν να περιληφθούν στο εγχείρημα ενός προγραμματιστή με μια εντολή. Κάθε αρχείο επικεφαλίδα περιέχει δηλώσεις συναρτήσεων, ορισμούς τύπων και μακροεντολές. Το περιεχόμενο τους περιγράφεται παρακάτω.

Σε σύγκριση με άλλες γλώσσες όπως η Java, η πρότυπη βιβλιοθήκη είναι μικροσκοπική. Παρέχει ένα βασικό σύνολο μαθηματικών συναρτήσεων, χειρισμό αλφαριθμητικών, μετατροπές τύπων και είσοδο/έξοδο (βασισμένο σε κονσόλα). Δεν περιέχει ένα τυποποιημένο σύνολο από "εμπεριέχωντες τύπους" (container types) όπως η Πρότυπη βιβλιοθήκη προτύπων της C++, πόσο μάλλον υποστήριξη για πλήρες κιτ εργαλείων γραφικής διασύνδεσης χρήστη(GUI), δίκτυα και τις πολλές επιπλέον λειτουργίες που περιέχει για παράδειγμα η Java. Το κύριο πλεονέκτημα μιας τόσο μικρής πρότυπης βιβλιοθήκης είναι ότι καθιστά ευκολότερη τη μεταφορά της C σε νέες πλατφόρμες. 

Πολλές βιβλιοθήκες έχουν αναπτυχθεί για να παρέχουν την επιπλέον λειτουργικότητα που λείπει από την πρότυπη βιβλιοθήκη της C. Για παράδειγμα, το εγχείρημα ανάπτυξης περιβάλλοντος επιφάνειας εργασίας GNOME έχει αναπτύξει το κιτ εργαλείων γραφικών GTK+ και την GLib, μια βιβλιοθήκη από εμπεριέχωντες δομές δεδομένων. Η ποικιλία των διαθέσιμων βιβλιοθηκών συνεπάγεται την αξία αυτών που έχουν επικρατήσει μέσω μιας διαδικασίας εξονυχιστικής επιλογής. Το μειονέκτημα όμως αυτής της πληθώρας βιβλιοθηκών είναι ότι παρουσιάζονται ασυμβατότητες όταν χρησιμοποιούνται στο ίδιο πρόγραμμα, και δυσχεραίνεται η συνεργασία μεταξύ των προγραμματιστών αφού γνωρίζουν διαφορετικές βιβλιοθήκες.

ANSI C βιβλιοθήκη - αρχεία επικεφαλίδες
---------------------------------------

|  |  |
| --- | --- |
|  **<assert.h>** | Περιέχει τις διαγνωστικές μακροεντολές που βοηθούν στην αποσφαλμάτωση ενός προγράμματος |
|  **<complex.h>** | Ένα σύνολο από συναρτήσεις για χειρισμό φανταστικών αριθμών. (νέο στο **C99**) |
|  **<ctype.h>** | Περιέχει συναρτήσεις για ταξινόμηση χαρακτήρων ανάλογα με τον τύπο τους ή για μετατροπή ανάμεσα σε κεφαλαία και μικρά με έναν τρόπο ανεξάρτητο του σύνόλου χαρακτήρων που χρησιμοποιείται (συνήθως ASCII η μια επέκταση του) |
|  **<errno.h>** | Για έλεγχο κωδικών λαθών που αναφέρονται από τις συναρτήσεις των βιβλιοθηκών. |
|  **<fenv.h>** | Για έλεγχο του περιβάλλοντος κινητής υποδιαστολής. (νέο στο **C99**) |
|  **<float.h>** | Περιέχει ορισμένες σταθερές με τις συγκεκριμένες ανά υλοποίηση ιδιότητες
των ακέραιων τύπων, όπως την ελάχιστη διαφορά μεταξύ δυο αριθμών κινητής υποδιαστολής (\_EPSILON), 
το μέγιστο πλήθος ψηφίων ακριβείας (\_DIG) και το εύρος των αριθμών που μπορούν να αναπαρασταθούν (\_MIN, \_MAX). |
|  **<inttypes.h>** | Για ακριβή μετατροπή μεταξύ ακέραιων τύπων. (νέο στο **C99**) |
|  **<iso646.h>** | Για προγραμματισμό στα σύνολα χαρακτήρων του προτύπου ISO 646. (νέο στο **NA1**) |
|  **<limits.h>** | Περιέχει ορισμένες σταθερές με τις συγκεκριμένες ανά υλοποίηση ιδιότητες
των ακέραιων τύπων,όπως π.χ. το εύρος των αριθμών που μπορούν να αναπαρασταθούν από κάποιο ακέραιο τύπο (\_MIN, \_MAX). |
|  **<locale.h>** | Για επιλογή (τοπικών ρυθμίσεων)locale. |
|  **<math.h>** | Για υπολογισμό κοινών μαθηματικών συναρτήσεων. |
|  **<setjmp.h>** | Για δηλώσεις setjmp/longjmp που χρησιμοποιούνται για μη-τοπικά άλματα. |
|  **<signal.h>** | Για έλεγχο διαφόρων εξαιρετικών συνθηκών. |
|  **<stdarg.h>** | Για πρόσβαση σε ένα κυμαινόμενο πλήθος παραμέτρων που περνάνε σε μια συνάρτηση. |
|  **<stdbool.h>** | Για ένα λογικό τύπο δεδομένων. (νέο στο **C99**) |
|  **<stdint.h>**  | Για ορισμό διαφόρων ακέραιων τύπων. (νέο στο **C99**) |
|  **<stddef.h>** | Για ορισμό χρήσιμων τύπων και μακροεντολών. |
|  **<stdio.h>** | Παρέχει τις κύριες δυνατότητες εισόδου εξόδου της γλώσσας C. Περιέχει και την ξακουστή συνάρτηση`printf`. |
|  **<stdlib.h>** | Για εκτέλεση διαφόρων λειτουργιών όπως μετατροπές, ψευδό-τυχαίους αριθμούς,δέσμευση μνήμης,
έλεγχος διεργασιών, περιβάλλον, αναζήτηση, ταξινόμηση και σήματα. |
|  **<string.h>** | Για χειρισμό αλφαρηθμητικών διαφόρων ειδών. |
|  **<tgmath.h>** | Για μαθηματικές συναρτήσεις γενικού τύπου. (νέο στο **C99**) |
|  **<time.h>** | Για μετατροπή μεταξύ διαφόρων μορφών ημερομηνίας και ώρας. |
|  **<wchar.h>** | Για χειρισμό wide ρευμάτων και διαφόρων ειδών αλφαρηθμητικών που χρησιμοποιούνε wide χαρακτήρες - σημαντικό για την υποστήριξη πολλών γλωσσών. (νέο στο **NA1**) |
|  **<wctype.h>** | Για ταξινόμηση wide χαρακτήρων. (νέο στο **NA1**) |

Η C πρότυπη βιβλιοθήκη στην C++
-------------------------------

Η γλώσσα προγραμματισμού C++ περιλαμβάνει την λειτουργικότητα της ANSI C πρότυπης βιβλιοθήκης, αλλά επιφέρει πολλές τροποποιήσεις, όπως την αλλαγή των ονομάτων των αρχείων επικεφαλίδας από <xxx.h> σε <cxxx> (παρ'όλα αυτά τα ονόματα τύπου C είναι διαθέσιμα αν και δεν συνίσταται η χρήση τους), καθώς και την τοποθέτηση όλων των αναγνωριστικών στον χώρο ονομάτων (namespace) `std`.

Κοινές βιβλιοθήκες υποστήριξης
------------------------------

Αν και δεν είναι τυποποιημένες, τα C προγράμματα βασίζονται σε βιβλιοθήκες συναρτήσεων που περιέχουν κώδικα που ο μεταγλωττιστής χρησιμοποιεί σε χρόνο εκτέλεσης. Για παράδειγμα, ο κώδικας που αρχικοποιεί τη διεργασία για το λειτουργικό σύστημα, πριν κληθεί η βασική συνάρτηση `main()` ενός προγράμματος, υλοποιείται από την C βιβλιοθήκη χρόνου-εκτέλεσης του κάθε μεταγλωττιστή.

Η C πρότυπη βιβλιοθήκη τεκμηριώνει *μόνο* πως οι συναρτήσεις που αναφέρονται σε αυτό το άρθρο είναι διαθέσιμες και πώς συμπεριφέρονται. Όμως επειδή κάποια συγκεκριμένη υλοποίηση ενός μεταγλωττιστή ίσως βασίζεται στην διαθεσιμότητα αυτών των συναρτήσεων χρόνου εκτέλεσης, επιπέδου υλοποίησης, είναι πιθανό αυτές οι ανά προμηθευτή συγκεκριμένες συναρτήσεις να "πακετάρονται" μαζί με την πρότυπη βιβλιοθήκη της C στην ίδια μονάδα, γιατί είναι πιθανό και οι δύο να χρειαστούν σε κάποιο πρόγραμμα.

Αν και συχνά, εξαιτίας αυτής της σύζευξης, η βιβλιοθήκη χρόνου εκτέλεσης της C συγχέεται με την πρότυπη βιβλιοθήκη της C, δεν είναι τυποποιημένο μέρος της γλώσσας και διαφέρει ανά προμηθευτή.

Δείτε επίσης
------------

* C++ Πρότυπη βιβλιοθήκη
* GNU C βιβλιοθήκη

Βιβλιογραφία
------------

* Brian W. Kernighan, Dennis M. Ritchie. *Η γλώσσα προγραμματισμού C -ANSI C-", Κλειδάριθμος 1990, Δεύτερη έκδοση.*

Εξωτερικοί σύνδεσμοι
--------------------

* Η πρότυπη βιβλιοθήκη Αρχειοθετήθηκε 2012-07-15 στο Wayback Machine.

### Αναλυτική περιγραφή των αρχείων επικεφαλίδων

* Οδηγός αναφοράς C πρότυπης βιβλιοθήκης (Αγγλικά)
* Microsoft C Run-Time Libraries στο MSDN (Αγγλικά)