CPL : programmation de style C

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 :

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

Raison

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.

Exemple

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.

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 comme du C++

Raison

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

Exemple

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

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

Raison

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

Exemple

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

Exemple

Vous pouvez appeler du C depuis du C++ :

// in C:
double sqrt(double);

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

sqrt(2);

Exemple

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
}

Application

Aucune mesure d’application n’est nécessaire.