C et C++ sont des langages étroitement liés.
Ils tirent tous deux leurs origines du « Classic C » de 1978 et ont évolué au sein des comités ISO depuis.
De nombreuses tentatives ont été faites pour les rendre compatibles, mais aucun n’est le sous‑ensemble de l’autre.
Résumé des règles C :
C++ offre une meilleure vérification de type et un support notationnel plus riche.
Il fournit un meilleur soutien à la programmation de haut niveau et génère souvent un code plus rapide.
char ch = 7;
void* pv = &ch;
int* pi = pv; // not C++
*pi = 999; // overwrite sizeof(int) bytes near &ch
Les règles de conversion implicite vers et depuis void* en C sont subtiles et non appliquées.
En particulier, cet exemple viole une règle interdisant la conversion vers un type avec un alignement plus strict.
Utilisez un compilateur C++.
Ce sous‑ensemble peut être compilé à la fois avec les compilateurs C et C++.
Lorsqu’il est compilé en C++, il bénéficie d’une meilleure vérification de types que le « C pur ».
int* p1 = malloc(10 * sizeof(int)); // not C++
int* p2 = static_cast<int*>(malloc(10 * sizeof(int))); // not C, C-style C++
int* p3 = new int[10]; // not C
int* p4 = (int*) malloc(10 * sizeof(int)); // both C and C++
C++ est plus expressif que C et offre un meilleur support pour de nombreux types de programmation.
Par exemple, pour utiliser une bibliothèque C tierce ou une interface système C, définissez l’interface bas‑niveau dans le sous‑ensemble commun de C et C++ afin d’obtenir une meilleure vérification de type.
Dans la mesure du possible, encapsulez l’interface bas‑niveau dans une interface qui suit les directives C++ (pour une meilleure abstraction, sécurité mémoire et sécurité des ressources) et utilisez cette interface C++ dans le code C++.
Vous pouvez appeler du C depuis du C++ :
// in C:
double sqrt(double);
// in C++:
extern "C" double sqrt(double);
sqrt(2);
Vous pouvez appeler du C++ depuis du C :
// in C:
X call_f(struct Y*, int);
// in C++:
extern "C" X call_f(Y* p, int i)
{
return p->f(i); // possibly a virtual function call
}
Aucune mesure d’application n’est nécessaire.