CPL : Programmation de style C

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 :

CPL.1 : Préférer C++ à C

Raison

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.

Exemple
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.

Application

Utilisez un compilateur C++.

CPL.2 : Si vous devez utiliser C, utilisez le sous‑ensemble commun de C et C++ et compilez le code C en C++

Raison

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.

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

CPL.3 : Si vous devez utiliser C pour les interfaces, utilisez C++ dans le code appelant utilisant ces interfaces

Raison

C++ est plus expressif que le C et offre un meilleur support pour de nombreux types de programmation.

Exemple

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

Exemple

Vous pouvez appeler du C depuis du C++ :

// en C :
double sqrt(double);

// en C++ :
extern "C" double sqrt(double);

sqrt(2);
Exemple

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
}
Application

Aucun besoin