C et C++ sont étroitement liés.
Ils proviennent tous les deux du « Classic C » de 1978 et ont évolué dans les comités ISO depuis lors.
De nombreuses tentatives ont été faites pour les maintenir compatibles, mais aucun n’est un sous‑ensemble de l’autre.
Résumé des règles C :
C++ offre une meilleure vérification de type et un meilleur support de notation.
Il offre un meilleur support pour la programmation de haut niveau et produit souvent du code plus rapide.
char ch = 7;
void* pv = &ch;
int* pi = pv; // pas C++
*pi = 999; // écraser sizeof(int) octets près de &ch
Les règles concernant le cast implicite vers et depuis void* en C sont subtiles et non imposé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é avec un compilateur C et un compilateur C++ et, lorsqu’il est compilé en C++, bénéficie d’une meilleure vérification de type qu’un C pur.
int* p1 = malloc(10 * sizeof(int)); // pas C++
int* p2 = static_cast<int*>(malloc(10 * sizeof(int))); // pas C, C++ de style C
int* p3 = new int[10]; // pas C
int* p4 = (int*) malloc(10 * sizeof(int)); // C et C++
C++ est plus expressif que le C et offre un meilleur support pour de nombreux types de programmation.
Par exemple, pour utiliser une bibliothèque C tiers ou une interface système C, définissez l’interface bas‑niveau dans le sous‑ensemble commun de C et C++ pour une meilleure vérification de type.
Si 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++ :
// en C :
double sqrt(double);
// en C++ :
extern "C" double sqrt(double);
sqrt(2);
Vous pouvez appeler du C++ depuis du C :
// en C :
X call_f(struct Y*, int);
// en C++ :
extern "C" X call_f(Y* p, int i)
{
return p->f(i); // appel éventuel d'une fonction virtuelle
}
Aucun besoin