C++ moderne et alternatives en C

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++

C
Exécuter →
main.c
#include <stdio.h>

int math_square(int value) {
    return value * value;
}

int main(void) {
    printf("%d\n", math_square(7));
}
Résultat de l’exécution
49
C++
Exécuter →
main.cpp
#include <iostream>

namespace math {
    int square(int value) {
        return value * value;
    }
}

int main() {
    std::cout << math::square(7) << '\n';
}
Résultat de l’exécution
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

C utilise des conventions de nommage, des callbacks, des macros et des struct de contexte.

C++

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.