Les espaces de noms en C++ et les préfixes de noms en C
Dans cette leçon, vous allez voir comment éviter les noms de fonctions en double dans un grand programme, avec les espaces de noms (namespace) du C++ et la convention des préfixes en C.
Introduction
Dans un grand programme ou quand on utilise de nombreuses bibliothèques, deux fonctions peuvent facilement porter le même nom. C++ résout ce problème avec les espaces de noms (namespace), des zones distinctes pour les noms. C n'a pas d'espaces de noms, les bibliothèques C ajoutent donc généralement un préfixe (prefix) aux noms, comme math_square.
Points importants
- Comprenez comment on fait en C avant d'apprendre les abstractions du C++.
- Exprimez la possession des ressources avec RAII et la sémantique de valeur (value semantics).
- Préférez les outils sûrs du point de vue des types du C++ aux macros et aux conversions de type.
Exemples de code C et C++
#include <stdio.h>
int math_square(int value) {
return value * value;
}
int main(void) {
printf("%d\n", math_square(7));
}
49
#include <iostream>
namespace math {
int square(int value) {
return value * value;
}
}
int main() {
std::cout << math::square(7) << '\n';
}
49
Comparaison entre C et C++
En C, le préfixe math_ n'est qu'une convention de nommage qui repose entièrement sur la rigueur du programmeur. En C++, la fonction square se trouve dans l'espace de noms math et s'appelle par son nom complet, math::square. Le compilateur garantit que des noms situés dans des espaces de noms différents n'entrent pas en conflit, et permet de donner un alias aux espaces de noms au nom trop long.
C utilise des conventions de nommage, des callbacks, des macros et des struct de contexte.
C++ offre des abstractions à la portée bien délimitée, sûres pour les types et généralement sans coût supplémentaire à l'exécution.
Exercices d'approfondissement
Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.
- Écrivez d'abord le mécanisme en C, puis utilisez la fonctionnalité équivalente du C++.
- Remplacez la libération manuelle des ressources par RAII.
- Vérifiez si la fonctionnalité provoque des allocations mémoire ou des appels de fonctions virtuelles.