De façon générale, la bibliothèque standard (au singulier) du langage C W désigne un ensemble de modules définissant des constantes, des types et des fonctions – on parle ici de « constantes » et de « fonctions » au sens large, car il peut aussi s'agir de pseudo‑constantes et de macro‑commandes. Tous ces éléments de code sont spécifiés par la norme du langage, qui ne cesse d'évoluer (cf. chap. C1‑II ). Et en conséquence, les implémentations de la bibliothèque standard doivent être régulièrement mises à jour. De cette manière, toute chaîne de compilation du langage C respectant la norme doit en principe pouvoir traiter de façon équivalente du code source n'employant que les éléments définis dans la bibliothèque standard, quel que soit l'environnement de programmation et la machine cible, autrement dit avec une portabilité optimale (cf. chap. C1‑I ).

De plus, dans les systèmes d'exploitation Linux ou équivalents (Unix, BSD…), la bibliothèque standard du langage C – communément appelée « libc » – joue un rôle central. En effet, la quasi‑totalité des composants logiciels fondamentaux du système sont codés en langage C (en particulier les commandes du système), et leur exécutable est produit par édition de liens dynamiques. Le chargement en mémoire partagée des fichiers objets de la libc s'effectue donc dès le démarrage du système ; ses symboles (cf. chap. C4‑IV ) forment une composante majeure de l'ABI – pour application binary interface W – du système.

Quant au langage C++, il dispose aussi de sa propre bibliothèque standard  W. Cette dernière inclut :

  • la quasi‑totalité de la bibliothèque standard du langage C – avec les adaptations nécessaires pour satisfaire aux objectifs d'une meilleure sécurité des programmes ;
  • ainsi que plusieurs dizaines d'autres modules qui exploitent les concepts de la programmation orientée objet (absents en C).

Et comme pour le langage C, la bibliothèque standard du C++ suit une norme évolutive et ses implémentations doivent faire l'objet de mises à jour régulières pour s'y conformer.

En revanche, même si de nombreuses applications (cf. chap. C1‑II ) utilisent la bibliothèque standard du C++ et en sont dépendantes, cette dernière n'est pas un composant aussi crucial que la libc pour les systèmes d'exploitation, même sous Linux (elle ne fait pas partie de son ABI).

Par ailleurs, il existe une immense variété d'autres modules de bibliothèques spécifiques à tel ou tel environnement : fonctions graphiques sur moniteur, manipulation de processus systèmes, protocoles de communication, etc. Ces modules ont une portabilité moindre que ceux de la bibliothèque standard, mais sont le plus souvent incontournables pour coder rapidement des fonctions complexes. Une partie de ces modules est librement accessible sur des sites de dépots comme GitHub W ; il serait donc dommage s'en priver. Ensuite, en partant de cette base, rien n'interdit d'en améliorer le codage.

En particulier, le framework Arduino repose sur un ensemble de modules de bibliothèque que l'on peut considérer comme format une « bibliothèque standard » dans la mesure où ils sont incontournables pour la compilation de tout programme source pour cartes Arduino – avec des spécificités pour telle ou telle famille de microcontrôleur embarqué. On parle du noyau Arduino – en anglais, Arduino core – et ses fichiers source sont tous en libre accès sur Github (cf. ce lien pour les cartes à mi).

De plus, il existe aussi une grande variété d'autres modules spécifiques compatibles avec l'environnement Arduino. Ces modules ont été développés pour faciliter l'emploi de composants périphériques à une carte à microcontrôleur : boucliers multi‑fonctions, écrans, capteurs en tous genres, actionneurs…

Si l'on s'en tient aux seules bibliothèques standards des langages C et C++, leurs modules totalisent des centaines de fonctions. Au regard d'une telle diversité, il n'est pas question ici de les présenter, ni exhaustivité, ni détail ; le résultat serait trop fastidieux et cela ferait double emploi avec les sites de référence, qui sont exactement là pour ça.

En contre‑partie, ce chapitre a pour objectif de fournir une brève description et un lien de documentation des principaux modules de la bibliothèque standard du langage C (et leur équivalent en C++) – le but étant de donner une vue d'ensemble, ou du moins un premier coup d'œil. Certains modules ayant une importance toute particulières (par exemple, stdio, time…), ils ont fait ou feront l'objet de chapitres de cours à part entière.

Quant au framework Arduino, après avoir rappelé le lien vers le site de référence des fonctions de base, on passera en revue les modules développés pour les composants périphériques les plus populaires – là encore, pour découvrir ce qui peut exister et qu'il serait contre‑productif de réinventer

Les bibliothèques standards des langages C et C++

La bibliothèque standard du langage C

La bibliothèque standard du langage C – dite ISO C library ou plus simplement « libc » W – totalise plusieurs centaines de fonctions, réparties sur 29 modules.

Cela peut sembler volumineux pour un codeur débutant, mais en comparaison avec d'autres langages, cette bibliothèque est volontairement réduite, afin d'optimiser la portabilité du langage. En effet, plus on incorpore des modules spécifiques à tel ou tel périphérique, plus il est difficile de garantir leur compatibilité universelle.

Il existe plusieurs implémentations de la libc qui sont open‑source et libres de droit, la plus célèbre étant certainement celle développée dans le cadre du projet GNU W, dite « glibc » W, distribuée sous licence GNU LGPL W. Tous les fichiers sources des modules de cette implémentation peuvent donc être librement consultés et téléchargés. Néanmoins, leur code est souvent très complexe. C'est donc plutôt à l'aide de livres et de sites de référence – comme par exemple Cppreference.com C – que les codeurs consultent le contenu de ces modules et trouvent notamment les prototypes des fonctions qui sont à leur disposition, assortis d'exemples d'application directe.

Dans le module stdlib, on trouve notamment les fonctions de conversion atoi (ASCII to int), atol (ASCII to long) et atoll (ASCII to long long).

Sur le site Cppreference.com, ces fonctions sont décrites dans une page web C dont une capture d'écran partielle est reproduite ci‑dessous :

En plus des prototypes respectifs de fonctions, on trouve une brève mais précise description :

  • du traitement qu'elles opèrent – ici, la conversion d'une chaîne de caractères numériques en une valeur entière ;
  • de l'argument qu'elles prennent (rubrique « Parameters ») ;
  • de la valeur qu'elles rendent (rubrique « Return value »).

Plus loin (mais non reproduit ci‑dessus) sont donnés des exemples directs d'application dans une fenêtre interactive. Chacun peut donc modifier et tester l'exécution de code proposé en exemple pour en parfaire sa bonne compréhension.

Implémentation sur système Linux

Sur un système Linux, sauf exceptions, la libc est implémentée par la glibc W du projet GNU (cf. supra ). Elle est installée comme une composante indispensable du système et chargée en mémoire partagée dès le démarrage du système.

Elle est évidemment totalement compatible avec la chaîne de compilation GCC (cf. chap. C1‑II  et C4‑IV ), qui est le plus souvent installée par défaut.

La bibliothèque standard du C++

Le langage C++ possède aussi une bibliothèque standard qui comporte, depuis l'adoption de la norme C++20, 75 modules W.

En comparaison avec celle du langage C, la bibliothèque standard du C++ offre une bien plus grande variété de fonctions, types, etc. tout en satisfaisant à l'exigence d'une bonne portabilité.

Parce que le langage C++ est beaucoup plus développé que le C, et qu'il est massivement utilisé pour produire de grands logiciels professionnels (CAO, bureautique, comptabilité, etc. – cf. chap. C1‑II ), sa bibliothèque standard représente un enjeu très important. C'est seulement en septembre 2019 que l'entreprise Microsoft a rendu publique son implémentation.

Il existe également l'implémentation de la fondation Apache W dont les fichiers source sont en libre d'accès. Mais comme avec le langage C, pour prendre connaissance des prototypes des fonctions du C++, il préférable dans un premier temps de consulter les sites de référence en ligne, comme Cppreference.com C++.

Compatibilité avec la libc

On rappelle (cf. chap. C2‑I ) que dans un programme en langage C, il est impossible d'inclure un fichier d'en‑tête de la bibliothèque standard du C++. (On est sûr de déclencher une erreur de compilation dès lors que ce fichier emploie des mots‑clefs spécifiques au C++.)

En revanche, l'inverse est faisable : par exemple, une directive comme #include <ctype.h> (fichier de la bibliothèque standard du C pour déterminer des types de caractères – cf. chap. C3‑VIII ) est autorisée dans un programme compilé en C++.

Toutefois, en C++, les modules de la bibliothèque standard du langage C sont considérés comme obsolètes (en anglais, deprecated). À la place, il est recommandé de privilégier le recours aux modules correspondants du C++, sachant que le nom de leur fichier d'en‑tête :

  • ne comporte pas d'extension .h ;
  • reprend exactement celui du langage C mais préfixé par la lettre c.

Ces modules sont conçu de façon plus satisfaisante au regard des exigences du C++, notamment en matière de fiabilité. Ainsi, en principe, il n'y a pas de recours aux macro‑définitions, etc.

Dans l'exemple donné ci‑dessus, on codera donc de préférence :
#include <cctype>

Il faut ne pas confondre :

  • le module cstdio qui est l'adaptation en C++ du module d'entrées‑sorties standard stdio du langage C
  • avec le module iostream qui regroupe les fonctions d'entrées‑sorties standards en C++ – qui opèrent avec une syntaxe complètement différente.
  • Ce module est difficile à aborder dès la première année de formation, il risque d'occasionner des confusions chez les codeurs débutants.

Quelques modules standards d'emploi fréquent

Les tableaux synthétiques ci‑après sont non exhaustifs et n'ont nullement vocation à se substituer à ceux que l'on peut trouver sur les sites de référence. Leur principal intérêt est :

  • d'indiquer les noms des fichiers à inclure par des directives #include ;
  • de citer quelques fonctions qui pourront être utiles par la suite, notamment lors des travaux pratiques.

De plus, pour chaque module, l'indication de la norme requise (2e colonne du tableau) n'est pas superflue :

  • elle doit être respectée par le script de compilation pour permettre l'inclusion de ces modules (cf. chap. C1‑II ) ;
  • attention, parfois l'exigence d'ultériorité de norme porte non pas sur le module tout entier mais seulement sur tel ou tel élément (fonction, type…) défini dans le module.
  • un tiret « – » signifie que ce module existe depuis l'origine du langage et donc qu'en principe, n'importe quelle version du compilateur le prend en charge ;
  • une astérisque « * » signifie qu'il s'agit d'un module optionnel, au sens où la norme n'impose pas aux implémentations d'inclure ce module .

Modules communs au C et au C++

Nom
C / C++
Norme
requise
Types et/ou
fonctions codées
stdlib.h
cstdlib
fonctions générales :
  • de contrôle d'exécution du programme (abort, exit…)
  • d'allocation dynamique de mémoire (malloc, free…)
  • de conversion des nombres en chaînes de caractères et réciproquement (atof, atoi…)
  • de génération de nombres aléatoires (rand, srand…)
  • de calcul numérique (abs, div…)
  • d'opérations dans un tableau (qsort, bsearch…)
stdarg.h
cstdarg
types et fonctions pour le codage de fonctions à arguments variables (notamment la fonction main)
stdbool.h
cstdbool
C99
C++11
type booléen et constantes (bool, true, false…)
remarque : cstdbool est inutile car déjà inclus dans le noyau du C++
stdint.h
cstdint
C99
C++11
types entiers de taille spécifiée (int_8t, int_16t…)
limits.h
climits
fonctions donnant les valeurs extrêmes encodables dans les types entiers pour la machine cible (CHAR_MIN, CHAR_MAX…)
float.h
cfloat
fonctions donnant les valeurs caractéristiques d'encodage dans les types décimaux à virgule flottante pour la machine cible (FLT_MIN, FLT_MAX…)
math.h
cmath
constantes et fonctions mathématiques les plus usuelles (trigonométriques, exponentielles, logarithmique…)
complex.h
complex
C99
*
types, constantes et fonctions mathématiques opérant sur les nombres complexes (creal, cimag…)
time.h
ctime
types, constantes et fonctions opérant sur les données temporelles (tm, time, difftime…)
ctype.h
cctype
fonctions d'évaluation et de manipulation de caractères (isalpha, isdigit, toupper…)
string.h
cstring
fonctions d'évaluation et de manipulation de chaînes de caractères (strlen, strcat…)
stdio.h
cstdio
fonctions d'entrées-sorties sur terminal standard, fichiers et chaînes de caractères (printf, scanf… )

Le framework Arduino

Le noyau Arduino

On rappelle que d'un point de vue logiciel, l'environnement Arduino est constitué d'un noyau défini dans un ensemble de modules de bibliothèque donc le fichier d'en‑tête principal est nommé Arduino.h (cf. chap. C1‑III ). L'implémentation du noyau dépend du type de carte employé. Pour les cartes à cœur AVR, les fichiers sources du noyau sont publiés ici G.

Toutefois, comme pour les fichiers de bibliothèque standard des langages C et C++, il est préférable de consulter un site de référence – en premier lieu le site officiel d'Arduino A pour prendre connaissance des détails de chaque élément de langage défini.

On trouve ainsi une page consacrée à la fonction isAscii A qui détermine si son argument, de type char, est inclus dans le jeu ASCII restreint.

En règle générale, les pages de références Arduino sont moins précises que celles d'un site comme cpprefecence.com. En effet, la page ci‑dessus n'indique pas le type de la valeur retournée par la fonction isAscii. Pour le savoir, il faut alors consulter le fichier source où cette fonction est déclarée : WCharacter.h. On y trouve notamment le prototype :
inline boolean isAscii(int c) __attribute__((always_inline));
qui lève l'ambiguïté – la fonction retourne une valeur booléenne. Par ailleurs, on peut noter que l'argument pris par la fonction est en fait de type int et non pas char !

Les modules pour composants périphériques

Au delà de la diversité de toutes les cartes à microcontrôleur compatibles, le framework Arduino est devenu un véritable écosystème technique avec le développement d'une grande variété :

  • d'extensions qu'on appelle boucliers (en anglais shields) – cf. celui en photo ci‑contre, qui comporte l'électronique de puissance nécessaire pour commander deux moteurs à courant continu ;
  • de composants (capteurs, préactionneurs, accessoires de communication, etc.) montés sur cartes électroniques directement raccordables à la carte à microcontrôleur (via des conducteurs enfichables dits jumpers).

Pour permettre de coder très facilement la mise en œuvre du composant dans un programme, un ou plusieurs modules de bibliothèque de fonctions sont développés et mis à disposition gratuitement.

Quelques modules de bibliothèque de périphériques Arduino

Les modules présentés dans le tableau synthétique ci‑après ne constituent qu'une toute petite partie de l'écosystème Arduino. Là encore, toute recherche d'exhaustivité serait vaine.

Pour chaque module, les colonnes du tableau indiquent respectivement :

  • le nom du fichier d'en‑tête du module (à inclure), ainsi qu'un lien vers sa documentation ;
  • remarque : bien que compilés en C++, ces fichiers sont nommés conformément aux conventions du langage C (avec l'extention .h) ;
  • un logo qui indique si le module est inclus dans l'environnement de simulation Tinkercad ;
  • une photographie ou un schéma du dispositif matériel auquel le module apporte une solution logicielle ;
  • un bref résumé des fonctionnalités que le module implémente.
Nom Composant Fonctionnalités
SPI.h A exploitation du bus SPI (Serial Peripheral Interface W) intégré à la carte à microcontrôleur pour communiquer avec un composant externe (capteur, écran, lecteur-enregistreur de carte, etc.)
Wire.h A exploitation du bus I2C (Inter-Integrated Circuit W) intégré à la carte à microcontrôleur pour communiquer avec un composant externe (capteur, écran, etc.)
Ethernet.h A exploitation d'une liaison Ethernet W via une extension ou un composant externe comportant une prise RJ45 et un circuit intégré dédié à son fonctionnement
WiFi.h A exploitation d'une liaison Wi‑Fi W via une carte, une extension ou un composant externe comportant une antenne Wi‑Fi et un circuit intégré dédié à son fonctionnement
SD.h A
SDfat.h G
lecture/écriture de données sur carte SD ou microSD W via un une extension ou un composant externe comportant un lecteur/enregistreur de carte
Attention : pour certains composants (chinois), employer le fichier SDfat.h et non pas SD.h
EEPROM.h A lecture/écriture de données sur mémoire EEPROM W intégrée au microcontrôleur ou sur un composant externe comportant une puce de mémoire EEPROM
RTC.h A exploitation d'une horloge temps-réel (real time clock W) intégrée à la carte à microcontrôleur ou sur un composant externe dédié
DHT.h G mesures de température et humidité avec un composant externe dédié comprenant un capteur DHT (digital temperature & humidity sensor )
LiquidCrystal.h A affichage de caractères sur un écran LCD (liquid crystal display W) porté par un bouclier ou un composant externe
Keypad.h A lecture de caractères saisis sur un pavé alpha-numérique (keypad W) porté par un composant externe
Servo.h A commande en position angulaire ou en fréquence de rotation du rotor d'un servomoteur de modélisme W
Stepper.h A commande en position angulaire ou en fréquence de rotation du rotor d'un moteur pas-à-pas de petite puissance associé à une carte électronique de puissance (module pilote) W