31 votes

Les fonctions de la bibliothèque standard C peuvent-elles être utilisées en C++ ?

Pour l'instant, je me familiarise avec le C et la bibliothèque standard du C et je me demande si mes connaissances dans ce domaine me seront utiles lorsque je me tournerai plus tard vers le C++.

J'aimerais donc savoir si je peux utiliser les fonctions fournies par la bibliothèque standard C dans un environnement C++, et également si et pourquoi il serait judicieux de le faire.

48voto

Basile Starynkevitch Points 67055

Oui, le C++ a été conçu à l'origine pour que toute bibliothèque C puisse être facilement utilisée en C++. Bien sûr, c'est un peu moins vrai (en particulier, si une bibliothèque C utilise un mot-clé C++ tel que try ou dynamic_cast cela ne fonctionnera pas ; de même, si une rappel codé en C++ passé à une bibliothèque C lève une exception, vous risquez d'avoir un gros problème).

La pratique standard pour utiliser un fichier d'en-tête C en C++ est la suivante

 extern "C" {
 #include <some_c_header_file.h>
 };

et les plus existant Les fichiers d'en-tête du C sont conçus pour coopérer avec le C++ en contenant des éléments tels que

 #ifdef __cplusplus
 extern "C" {
 #endif

 //// most of the header material goes here, C style

 #ifdef __cplusplus
 }; // end extern "C"
 #endif

Dans la pratique, de nombreux en-têtes standard C ont des en-têtes C++ équivalents qui enveloppent des choses comme ci-dessus (et également dans les éléments suivants namespace std ). Eg C <stdio.h> est C++ <cstdio> -mais vous devriez souvent préférer les véritables flux C++ ( <iostream> ), mais printf -Les routines de ce type sont généralement plus localisation amicale mélangée à gettext(3) .

Cependant Le C et le C++ sont des langages très différents. Vous devez coder en langage C++11 idiomatique (en utilisant le langage C++ standard). conteneurs , auto , fermetures , RAII , pointeurs intelligents , règle de cinq , SFINAE , exceptions , fonctions anonymes , ...)

Certaines fonctions C standard ne sont pas très utiles en C++ idiomatique. Par exemple, il est peu probable que vous utilisiez directement malloc en véritable C++ (au moins préférer new -ce qui reste très bas niveau et n'est plus dans l'esprit du C++, mais plutôt utiliser beaucoup les conteneurs et les pointeurs intelligents. sans traiter manuellement l'allocation du tas). Mais POSIX fonctions (notamment syscalls(2) ....) sont très utiles en C++. longjmp est susceptible d'être incompatible avec les exceptions C++.

BTW, C++ a évolué beaucoup au cours de ce siècle. N'apprenez pas C++98 mais au moins C++11 (il y a formidable différences entre eux) et peut-être C++14 . Utilisez un récent compilateur ( CCG ou Clang/LLVM ) ; en décembre 2015, cela signifie CCG 5 au moins ou Clang/LLVM 3.7 au moins. N'oubliez pas d'activer tous les avertissements et les informations de débogage dans le compilateur (par ex. g++ -Wall -Wextra -g -std=c++11 )

C++ (c'est-à-dire C++11 au moins) est un difficile langage de programmation considérablement plus complexe que C. Il vous faudra des semaines de lecture pour en apprendre une partie, et un bon style de codage et une bonne discipline sont essentiels (vous pouvez facilement écrire du code très mauvais en C++). Commencez par Programmation : Principes et pratique de l'utilisation de C++

Je crois que si vous ne connaissez que C, la lecture SICP (et étudier un peu de Scheme) antes de l'apprentissage du C++ en vaut la peine.

La notion de comportement indéfini est très important, tant en C et probablement encore plus en C++. Vous devez absolument le comprendre (voir l'article de C.Lattner intitulé blogue à ce sujet ) et éviter il.

Vous apprendrez également beaucoup en étudiant (et peut-être en contribuant) à certains projets existants. logiciel gratuit et son code source. C'est pourquoi je recommande d'utiliser Linux.

20voto

Zaibis Points 1616

Je vais simplement citer un paragraphe de la norme ISO/IEC N3690 (norme c++).

17.2 La bibliothèque standard C

1 La bibliothèque standard C++ met également à disposition les fonctionnalités de la bibliothèque standard C, ajustées de manière à garantir la sécurité statique des types.

Alors tout simplement oui !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X