2. INCOMPATIBILITES DU C ET C++
Le C++ étant une extension du C, tout programme C devrait se traduire correctement par le C++ et l'exécution fournir les mêmes résultats. Si cet objectif est effectivement atteint en pratique, quelques incompatibilités avec le C stantard ont tout de même subsisté, inhérentes à l'esprit de conception des deux langages.
2-1. Définitions des fonctions en C++
Soit à définir une fonction fexple, fournissant une valeur de retour de type double et recevant deux arguments, l'un de type int, l'autre de type double. Pour cela on peut, en C, procéder de l'une de deux manières:
1ère manière
2ème manière
La première forme étant la seule prévue par la définition initiale de Kernighan et Ritchie, la seconde a été introduite par le C ANSI qui n'a pas exclu l'ancienne. Le C++ n'accepten quant à lui, que la seconde forme.
2-2. Prototypes en C++
En C, pour utiliser une fonctionl n'ayant pas été définie dans le même fichier source, on pouvait:
- ne pas la déclarer (on considérait alors que sa valeur de retour était de type int);
- la déclarer en ne précisant que le type de la valeur de retour (par exemple, double, fexple);
- la déclarer à l'aide de son prototype (par exemple, double fexple(int, double).
Exemple
Si la définition et la déclaration de fonction sont dans un même fichier source, le compilateur peut vérifier la conhérence entre en-tête et prototype. L'absence de correspondance exacte de types (entre prototype et en-tête) déclenche une erreur.
Exemple correcte
Exemple incorrecte
Si la définition et la déclaration d'une fonction ne figurent pas dans le même fichier source, le contrôle n'est plus possible. Pour utiliser une telle fonction, il faut placer son prototype dans un fichier en-tête incorporé.
2-3. Arguments et valeur de retour
En ce qui concerne les points communs entre le C et le C++, arguments et valeur de retour peuvent, soit ne pas exister, soit être une valeur scalaire de type quelconque. Il est à noter qu'il subsiste une disparité entre tableaux et structures puisque:
- il est possible de transmettre la valeur d'une structure, aussi bien en arguments qu'en valeur de retour;
- il n'est pas possible de faire de même avec les tableaux.
Concernant les différences ces deux langages, elles ne portent que sur la syntaxe d'en-têtes et de prototypes des fonctions, et uniquement dans les deux cas de fonctions sans argument et/ou sans valeurs de retour.
2-3-1. Fonctions sans arguments
Alors qu'en C on peut employer le mot void pour définir (en-tête) ou déclarer (prototype) une fonction sans arguments, en C++, on fournit une liste vide. Exemple:
- float fct(void); /* version du C*/
- float fct(); /* version du C++ */
2-3-2. Fonctions sans valeur de retour
Si en C, on peut utliliser le mot void pour définir ou déclarer une fonction sans valeur de retour, en C++, on doit absolument le faire comme dans cet exemple:
- void fct(int, double); /* valable en C/C++ */
- fct (int, double); /* le C++ interprète comme int fct(int, double); */
2-4. Le qualificatif const
Le C standard a introduit le qualificatif const, précisant qu'un symbole correspond à quelque chose dont la valeur ne change pas, et au compilateur de signaler toute tentative de modification. Si cela reste vra, en C++, quelques différences apparaissent concernant la portée et l'utilisation du symbole dans une expression.
2-4-1. Portée de const
Pour const s'appliquant à des variables automatiques, pas de différence entre C et C++. Par contre, si const s'applique à une valeur globale (statique), le C++ limite la portée de const au fichier source contenant la déclaration (comme s'il avait reçu l'attribut static), pendant que le C n'imposait aucune limitation.
2-4-2. Utilisation du const dans une expression
La valeur d'une expression constante étant calculée à la compilation, avec:
l'expression:
2 * p * 5
n'est pas une constante en C alors qu'elle en est une en C++. Ceci est surtout sensible aux déclarations de tableaux dont les dimensions sont obligatoirement constantes. Ainsi, les instructios:
cont int nel = 15;
..............
double t1[nel + lj], t2[2 * nel][nel];
seront acceptées en C++, alors qu'elles étaient refusées en C.