Je suis initié à l'informatique depuis un peu plus d'un an et, d'après mon expérience, il semble que les langages C et C ++ sont considérés comme des langages "ultra-rapides", alors que d'autres, tels que Python et de tels langages de script, sont généralement considérés comme un peu plus lents. .
Mais j'ai également vu de nombreux cas dans lesquels un projet logiciel, voire un petit, entrelacerait des fichiers où un certain nombre n de ces fichiers seraient écrits en C, et un certain nombre m de ces fichiers le seraient en C ++.
(J'ai aussi remarqué que les fichiers C ++ ont presque toujours des en-têtes correspondants, alors que les fichiers C ne le sont pas vraiment). Mais mon objectif principal est d’obtenir une impression générale d’intuition sur le moment approprié pour utiliser C sur C ++ et sur l’utilisation du C ++ sur C autres que les faits que (1) C ++ est orienté objet alors que C n'est pas, et (2) les syntaxes sont très similaires, et C ++ a été créé intentionnellement pour ressembler à C de plusieurs manières, je ne suis pas sûr de ce que sont leurs différences. Il me semble qu’ils sont (presque) parfaitement interchangeables dans de nombreux domaines.
Donc, il serait apprécié que quelqu'un puisse éclaircir la situation! Merci
virtual
et quelques autres fonctionnalités qui empêchent les optimisations, mais par exemple les non-virtual
classes ne sont pas intrinsèquement inefficaces, et les modèles sont une puissant outil d'abstraction qui peut réellement conduire à plus efficace - par exempleqsort
vsstd::sort
). (2) La grande importance de l'exactitude est une raison d'utiliser C ++ (sécurité typographique,const
ness,private
RAII pour rendre la gestion des ressources gérable, etc.) au-dessus de C. Ou d'ailleurs, utilisez Ada ou quelque chose en premier lieu.void*
un type à un autre pointeur dans le code C, c'est très distrayant et typique des personnes qui ne connaissent pas C.Réponses:
Vous choisissez C quand
Dans tous les autres cas, vous devriez choisir C ++.
la source
Il y a quelques raisons de préférer C. C’est qu’il est généralement plus difficile de produire des exécutables vraiment petits avec C ++. De toute façon, vous écrivez rarement beaucoup de code pour les systèmes vraiment petits, et l’espace ROM supplémentaire qui serait nécessaire pour C ++ plutôt que C peut être important.
Je devrais également ajouter, cependant, que pour des systèmes vraiment minuscules, C a des problèmes pour exactement la même raison et que le langage d'assemblage est presque le seul choix raisonnable. La gamme de tailles de systèmes dans laquelle C est logique a du sens, est assez petite et diminue constamment (bien que je l’admette, assez lentement).
Une autre raison / utilisation de C est de fournir un ensemble de fonctions auxquelles vous pouvez vous connecter à partir de n’importe quel autre langage. Vous pouvez écrire ces fonctions en C ++ en les définissant comme des
extern "C"
fonctions, mais cela les limite à présenter au monde une "face" essentiellement en C-life - les classes, les fonctions surchargées, les modèles, les fonctions membres, etc. appliquer. Cela ne limite cependant pas nécessairement le développement en C: il est parfaitement raisonnable d'utiliser toute sorte de fonctionnalités C ++ en interne , tant que l'interface externe ressemble à C.Dans le même temps, je dois dire que les réponses de @ Toll (pour un exemple évident) ont des inconvénients à presque tous les égards. C ++ raisonnablement écrit sera généralement au moins aussi rapide que C et souvent au moins un peu plus rapide. La lisibilité est généralement bien meilleure, ne serait-ce que parce que vous n'êtes pas plongé dans une avalanche de tout le code, même pour les algorithmes et les structures de données les plus triviaux, pour la gestion des erreurs, etc.
Les modèles ne "règlent pas un problème avec le système de types du langage", ils ajoutent simplement un certain nombre de fonctionnalités fondamentales quasiment absentes de C et / ou de C ++ sans modèles. L'une des intentions initiales était de fournir des conteneurs sécurisés, mais en réalité, ils vont bien au-delà, ce que C ne fournit essentiellement pas.
Les outils automatisés sont également un gros piège. S'il est vrai qu'écrire un analyseur C demande moins de travail que d'écrire un analyseur C ++, la réalité est que cela ne fait pratiquement aucune différence. Très peu de gens sont disposés ou capables d’écrire un analyseur syntaxique utilisable pour l’un ou l’autre. En tant que tel, le point de départ raisonnable est Clang de toute façon.
En l'occurrence, C et C ++ sont assez souvent utilisés ensemble sur les mêmes projets, gérés par les mêmes personnes. Cela permet quelque chose qui est par ailleurs assez rare: une étude qui compare directement et objectivement la maintenabilité du code écrit dans les deux langues par des personnes qui sont également compétentes (c’est-à-dire exactement les mêmes personnes). Au moins dans l’étude connexe, une conclusion était claire et sans équivoque: "Nous avons constaté que l’utilisation de C ++ au lieu de C entraîne une amélioration de la qualité du logiciel et une réduction des efforts de maintenance ..."
la source
Les différences entre C et C ++ ont déjà été énumérées en détail ici . Bien que parfois les gens aient des raisons légitimes de choisir l’un ou l’autre (C ++ pour la POO ou le C quand ils ont l’impression que les fonctionnalités supplémentaires du C ++ introduisent un surcoût indésirable, par exemple), j’ai constaté que c’est généralement une préférence. Qu'est-ce que les personnes qui travaillent sur ce dossier savent mieux et aiment mieux? Je pense que c'est la raison la plupart du temps, car il est vrai que ces langages s’adressent à des applications critiques en termes de performances.
(Note latérale: Consultez le discours de Linus Torvads sur la raison pour laquelle il préfère le C au C ++. Je ne suis pas nécessairement d'accord avec ses arguments, mais cela vous explique pourquoi les gens pourraient choisir le C plutôt que le C ++. Plutôt, les gens qui sont d'accord avec lui. pourrait choisir C pour ces raisons.)
la source
-1
pour le coup de gueule de Linus. : - {Le principal problème qui manque dans les réponses existantes (au moment de cette publication) est le choix.
C'est simple. Si, pour une raison totalement irrationnelle, vous estimez que les exceptions ne valent rien, vous n’avez pas à les utiliser . Vous pouvez toujours avoir des modèles, RAII et la bibliothèque Standard, et ne jamais écrire un seul "lancer". La même chose vaut pour les modèles. Si, pour une raison quelconque, vous pensez qu'ils provoquent un gonflement exécutable irrévocable (et réellement important, il ne concerne que les processus incorporés), alors surprise, vous pouvez utiliser void * et sizeof (T) toute la journée. Rien ne vous oblige à utiliser les fonctionnalités C ++ sur C.
C'est pourquoi le langage C ++ est un langage intrinsèquement supérieur: vous pouvez choisir les fonctionnalités de votre choix et recourir à la programmation de style C lorsque vous n'aimez pas une fonctionnalité donnée. Par conséquent, étant donné que C ++ est tout ce que C est et plus, c’est un fait évident que C ++ est un langage supérieur. Suggérer le contraire, c'est comme essayer de suggérer que 4 est supérieur à 5.
la source
Des choses sur le C ++ qui rendent les programmeurs C nerveux
Il y a beaucoup de magie qui se passe sous le capot; constructeurs, destructeurs, méthodes virtuelles, modèles, etc., peuvent rendre le code C ++ beaucoup plus facile et plus rapide à écrire que le code C équivalent, mais plus difficile à comprendre et à raisonner (en fonction de votre connaissance du C ++ et de ses conventions associées). Quelque chose d'aussi simple que
Foo newFoo;
d'invoquer beaucoup de code, dépend de laFoo
définition du constructeur de la classe (et des classes dont il dépend). C'est aussi pourquoi la convention est d'écrire++it
au lieu d'it++
itérer à travers un conteneur, car postfix++
implique souvent une opération de copie coûteuse.Selon ce que vous faites, il peut y avoir des frais généraux non triviaux, en particulier pour des tâches simples. Prenez les deux programmes suivants, le premier en C et le second en C ++:
Comportement identique, pas beaucoup de différence en termes de source, mais sur la case SLES 10 sur laquelle je travaille avec gcc 4.1.2, le premier génère un exécutable de ~ 9 Ko, alors que le second prend plus de 12,5 Ko (aucune optimisation). ), presque 28% plus grande. Le
string
type C ++ est beaucoup plus facile à utiliser avec IMO que la bibliothèque de chaînes C, et les flux C ++ sont beaucoup plus flexibles et personnalisables que les flux C, mais pour un code vraiment mortel comme celui-ci, ils ne valent peut- être pas la surcharge.Le C ++ est un langage énorme comparé au C, avec une sémantique extrêmement complexe. Il faut beaucoup plus de temps pour maîtriser le C ++ que le C, ce qui signifie que beaucoup de personnes qui prétendent connaître le C ++ ne le savent pas aussi bien qu’elles le pensent.
Ce qui rend les programmeurs C ++ nerveux
C n’est en aucun cas un langage de programmation sécurisé; l'absence de contrôle des limites sur les tableaux entraîne de nombreux comportements exploitables (que ce soit via la fonction maintenant morte
gets
ou viascanf
les spécificateurs de conversion%s
et%[
). C ++ au moins vous donne des conteneurs qui lèvent des exceptions si vous essayez d'accéder en dehors de leur plage actuellement définie; tout ce que C vous donne est (si vous avez de la chance) une violation de segmentation.La gestion de la mémoire en C demande beaucoup de travail et est sujette aux erreurs, par rapport aux outils que C ++ vous fournit. Si vous construisez votre propre conteneur, vous êtes responsable de la mise en correspondance de tous les appels
malloc
etfree
, en vous assurant que les allocations sont réussies, en supprimant les allocations partielles en cas d'erreur, etc. En C ++, vous ajoutez simplement des éléments à ou retirer les articles du conteneur. S'il y a un problème, une exception sera levée.De même, la gestion des erreurs en C est un casse-tête comparé aux outils fournis par C ++ (à savoir, des exceptions). Ce qui est vraiment amusant, c’est quand vous avez alloué beaucoup de mémoire et que vous avez touché un mur dans votre traitement; comme vous devez revenir en arrière, vous devez libérer cette mémoire dans le bon ordre. Avec les principes C ++ et RAII, cela est (relativement) facile à faire.
Alors, quand dois-je utiliser l'un sur l'autre?
Si ce que vous écrivez est très simple, lisez-le / bougez-le / supprimez-le, dont le comportement peut être décrit proprement en termes d'entrées et de sorties, et de performances, puis préférez le C au C ++. Sinon, préférez C ++
la source
Bjarne Stroustrup gère une liste d'applications et d'entreprises utilisant le langage C ++. vous pouvez argumenter autant que vous voulez sur la programmation procédurale ou POO, mais vous ne pouvez pas contester les résultats de l'industrie au cours des 20 dernières années.
Le C ++ est couramment utilisé pour les projets complexes, à grande échelle et à grande échelle, dans lesquels des personnes distinctes doivent travailler sur des composants modulaires. Bien sûr, vous pouvez créer et gérer du code modularisé en C, mais la nature intrinsèque de la POO du C ++ conduit à une modularisation, une testabilité et une réutilisation du code supérieures.
La bibliothèque standard C ++ (STL), en elle-même avec juste des vecteurs et des cartes, est une raison suffisante pour utiliser C ++.
C est couramment utilisé pour les systèmes embarqués.
Personnellement, je n’utiliserais C que s’il existe une bibliothèque qui n’a qu’une API C.
la source
Je dirais que la raison principale pour laquelle je choisirais le C ++ plutôt que le C ++, c’est seulement quand je devrais avoir recours au genre de choses "Cela doit être stable à 1000%" de la NASA.
Le C ++ est ~ 99% C quand on regarde la performance, et c'est beaucoup plus productif. Ainsi, même en C, vous pouvez écrire du code plus rapide que le C ++ (vous pouvez utiliser un sous-ensemble de C ++ sans exceptions, virtuel, diffusion en continu, abstractions, etc., mais c’est bien le C), le temps d’optimiser Tandis que STL est déjà testé, il vous en coûterait plus que les gains de performances minimes que vous pourriez obtenir, ou que vous sacrifiez parce que les algorithmes STL ont été écrits par des groupes d’experts, et vous n'êtes probablement pas un expert en tout.
D'autre part, le C ++ a une tonne d'abstractions. Quand ils fuient, cela vous crée des problèmes. Et il y a peu de personnes qui connaissent 100% des pièges C ++, alors que, je suppose, il y en a plus qui connaissent tous les pièges du C, il est donc beaucoup plus facile d'écrire une solution où chaque étape est parfaitement comprise par tous les membres d'une équipe.
Exemple: Savez-vous quand il
shared_ptr<smthn>
va déborder de son nombre de références, levera-t-il une exception? Des choses comme celles-là ne sont pas cool quand Shuttle doit rentrer dans l'atmosphère, du moins je suppose.En outre, la gestion des exceptions est très difficile par rapport aux codes d'erreur. Il est difficile de savoir si la classe est à 100% sans danger pour les exceptions et facile à pénétrer dans les fuites. Beaucoup de représentants de haut niveau ont exprimé cette opinion.
la source
std::string
? Avez-vous déjà essayé de spécifier une plate-forme oùshared_ptr
le compteur déborderait? Ce serait une plate-forme amusante. Et si vous pensez que la gestion des exceptions est difficile, vous devriez jeter un coup d'œil à un morceau de code C qui vérifie toutes les erreurs possibles lors de chaque appel de fonction. (Un tel code est difficile à trouver, je l’admets, mais c’est un argument encore plus fort contre votre déclaration.) Désolé, mais c’est vraiment des excréments de bovins.std::string
si vous ne voulez pas d'allocation dynamique. Vous utiliseriezstd::basic_string<char, std::char_traits<char>, some_allocator_here>
.C est un assemblage portable avec une meilleure syntaxe, donnant au programmeur le contrôle total de tout .
C ++, en revanche, fait beaucoup de magie géniale (fonctions virtuelles, surcharge, conversion automatique, etc.) qui peut ne pas être souhaitable si vous voulez vous assurer que:
Et vous voulez travailler avec quelque chose de vraiment simple, puisque vous vous concentrez sur la performance.
Il n'y a aucune surprise, et c'est très précieux.
Si vous le souhaitez (et je le recommande), lisez les instructions de codage JSF sur ce à quoi vous devez penser lors de l’écriture en C ++ pour le contrôle de l’avionique militaire. Vous devez être au courant de beaucoup de pièges et cela peut vous surprendre. Bjarne faisait partie de ce document, alors il sait de quoi il s'agit.
En outre, C se compile comme un troll échaudé frappé par la foudre. C ++, OTOH, a probablement été sponsorisé par les mêmes personnes qui ont investi dans des sociétés SSD. :)
(Personnellement, je préférerais le C ++, mais je ne l'aime pas non plus. ;-P)
la source
int
est de 64 bits, il faut au moins un opérande pouruint64_t
empêcher le comportement indéfini, mais le fait de convertir en 64 bits pour calculer un résultat 32 bits est, pour le dire gentiment, "surprenant".(étant donné que vous avez une connaissance égale des deux langues)
Optez pour C ++ sauf s’il n’ya pas de compilateur C ++ pour votre plate-forme. Vous pouvez écrire du code C ++ sans la portion de langage que vous n'aimez pas (pas de classes, d'exceptions, d'héritage virtuel, quelles que soient les restrictions personnelles que vous souhaitez appliquer), puis à un moment ultérieur, si vous décidez de vouloir ces fonctionnalités après tout, alors vous pouvez facilement les utiliser. Rien en C ++ ne vous empêche d'écrire du code de style C.
(avec des jeux d'outils et des connaissances de développeur équivalents) Il n'y a aucune raison de choisir C plutôt que C ++, à condition que votre plate-forme dispose d'un compilateur C ++. Vous pouvez simplement vous limiter au sous-ensemble de la langue que vous souhaitez utiliser aujourd'hui, tout en laissant la porte ouverte pour une extension ultérieure.
la source
Les deux langues sont excellentes. Je pense qu'un certain nombre d'affiches ont détaillé les points forts et les diverses utilisations de chacune. Je vais simplement ajouter ceci:
Je vois le langage C parfait dans 4 domaines: 1) je pense que c'est le meilleur langage à utiliser lors de l'apprentissage initial de tout type de programmation [associé à des notions d'assemblage et de connaissance du code machine], 2) qu'il est idéal pour écrire des pilotes, 3) intégré logiciel, et 4) logiciel système au niveau le plus bas.
C ++ est un langage orienté objet, mais il peut aussi être procédural (très semblable à C). Si vous travaillez sur des projets à grande échelle, des logiciels basés sur une interface graphique, des logiciels de jeu et d'autres types de logiciels à forte intensité graphique, je trouve que C ++, Java ou même Objective-C sont votre meilleur choix. Cependant, il existe de nombreux programmes en ligne de commande ou logiciels système dans lesquels C ++ peut être aussi bon ou meilleur que C.
la source
À mon avis, il manque un point à cette discussion: il est plus simple en C de fournir une interface binaire stable à partir d’une bibliothèque. Les deux pour une utilisation avec d'autres langages ainsi que C ++.
En C ++, différents compilateurs utilisent des noms différents pour que les utilisateurs d'une bibliothèque compilée avec un compilateur différent de la bibliothèque puissent avoir des problèmes d'utilisation. Avec C, l'interface binaire est généralement normalisée pour la plate-forme.
Je sais que de nos jours, les compilateurs utilisent souvent des commutateurs pour produire des éléments compatibles avec gcc, mais cela n’aide pas toujours.
J'observe cela assez souvent sur Solaris. La distribution et les différents éditeurs de logiciels utilisent généralement Sun Studio car, en particulier sur les systèmes Sparc, les résultats sont souvent meilleurs. Les projets open source de Man sont écrits avec du code spécifique à gcc. Cela peut être assez pénible de faire travailler ceux-là ensemble.
la source
C est probablement préférable au C ++ lorsque le code C est généré (par exemple, dans des implémentations de langages de niveau supérieur). Par exemple, plusieurs compilateurs de type Lisp émettent du code C (par exemple, Chicken , Scheme48 ...), mais je ne connais aucun de ceux qui émettent du code C ++ authentique (mon outil MELT émet du code C ++, mais je n'appellerai pas ce code authentique. Code C ++, il utilise très peu de fonctionnalités C ++).
Le code C est également plus facile à prouver de manière semi-automatique. Des analyseurs statiques comme Frama-C (où vous annotez votre code C avec des commentaires ACSL pour aider le prouveur à raisonner votre code) sont disponibles pour C, mais pas tant que ça pour le C ++ 11 complet.
la source