Quand utiliser C sur C ++ et C ++ sur C?

164

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

Dark Templar
la source
4
L'utilisation de C inline dans le code C ++ est généralement utilisée pour certains modules qui doivent être hautement optimisés, travailler au plus bas niveau au plus près du matériel, ou sont essentiels pour l'intégrité des données ou même la sécurité des personnes, et doivent être vérifiables et vérifiés. Plutôt que de tout faire en C, le gros du projet peut tirer parti des fonctionnalités du C ++ pour des conceptions flexibles, tout en tirant parti des avantages de l'étanchéité de C dans les endroits où il est nécessaire.
Kylben
30
@kylben: Beaucoup de gars de C ++ vous diront: (1) Les performances ne sont pas une raison pour passer en C (peut-être pour éviter virtualet quelques autres fonctionnalités qui empêchent les optimisations, mais par exemple les non- virtualclasses ne sont pas intrinsèquement inefficaces, et les modèles sont une puissant outil d'abstraction qui peut réellement conduire à plus efficace - par exemple qsortvs std::sort). (2) La grande importance de l'exactitude est une raison d'utiliser C ++ (sécurité typographique, constness, privateRAII pour rendre la gestion des ressources gérable, etc.) au-dessus de C. Ou d'ailleurs, utilisez Ada ou quelque chose en premier lieu.
11
@ Pubby8 Je ne suis pas d'accord avec cela. Si je travaille sur un fichier .c et que je vois des gens le faire, j'ai tendance à les signaler mentalement comme ne sachant pas ce qu'ils font. Par exemple, il n'est pas nécessaire de passer d' void*un type à un autre pointeur dans le code C, c'est très distrayant et typique des personnes qui ne connaissent pas C.
asveikau
4
@kylben: (Vous voudrez peut-être apprendre à vous adresser correctement aux autres dans vos réponses, afin qu'ils aient une chance de les voir .) Ce "programmeur très familier avec la façon dont le compilateur transforme C en asm" fonctionnerait pour C ++ de la même manière que bien. Mais ce n’est tout simplement pas pertinent: si vous voulez vous mêler à asm, écrivez simplement asm au lieu de le faire créer par un compilateur à partir d’un autre langage. Cela pourrait changer après chaque mise à jour du compilateur.
sbi
9
À mon humble avis ... vous utilisez C quand vous voulez, pour moi: C est beaucoup plus simple et facile à utiliser que C ++ ... C ++ peut ressembler à un "C avec des classes", mais ce n'est plus, maintenant un langage très complexe, avec des choses comme Constructeurs Virtuels et Modèles.
Dysoco

Réponses:

184

Vous choisissez C quand

  • vous avez besoin d'un assembleur portable (qui est ce que C est, vraiment) pour une raison quelconque,
  • votre plate-forme ne fournit pas de C ++ (un compilateur C est beaucoup plus facile à implémenter),
  • vous devez interagir avec d'autres langages pouvant uniquement interagir avec C (généralement le plus petit dénominateur commun sur n'importe quelle plate-forme) et votre code est constitué d'un peu plus que l'interface, ce qui ne justifie pas la peine de superposer une interface C sur du code C ++.
  • vous piratez un projet Open Source (dont beaucoup, pour diverses raisons , restent en C),
  • vous ne connaissez pas le C ++.

Dans tous les autres cas, vous devriez choisir C ++.

sbi
la source
15
J'ajouterais également que C ++ avec un modèle d'exception apporte parfois plus de problèmes que cela ne vaut, par exemple, les noyaux d'OS. Au moins c'est le sentiment général que j'ai eu lors de la lecture de choses.
Codeur
12
@SF: C est la lingua franca? C'est nouveau. Ou plutôt très vieux. Peut-être que si vous ne parlez qu'avec des personnes qui n'ont pas appris de nouvelles langues au cours des 20 dernières années, je dirais que la connaissance du C n'est plus très courante.
DeadMG 10/10
13
@SF .: Comme je l'ai écrit ailleurs, j'ai participé à des projets équivalant à des millions de LoC et vu très peu de méta-trucs par rapport aux projets C avec leur macro-hackery inévitable et omniprésent. (OTOH, la capacité de créer des EDSL lorsque cela est nécessaire peut être un outil incroyablement puissant dans votre boîte.) En ce qui concerne le fait que C soit la lingua franca: Je préférerais que mon terme reste le plus petit dénominateur commun. Et je ne voudrais pas que les personnes ayant des compétences en programmation modérées piratent un noyau de système d'exploitation.
sbi
18
@ Max: Je suis complètement en désaccord. C est un langage inutile, sauf si une barrière insurmontable empêche l’utilisation du C ++.
DeadMG
17
@ Boutons: C'est vous qui avez fait une réclamation ("C ++ a besoin de plus de mémoire"), donc ce devrait être à vous de le sauvegarder. Et non, je ne prétends pas que C ++ a besoin de moins de mémoire. Ce que je dis, c'est que les fonctionnalités ont un coût, que le compilateur les implémente pour vous (fonctions virtuelles) ou que vous les fassiez vous-même (tableau de pointeurs de fonctions).
sbi
88

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

Jerry Coffin
la source
12
Le support d’outil n’est pas un hareng rouge. Certes, nous avons maintenant clang. Cependant, la prise en charge des outils pour C ++ est très en retard par rapport à d’autres langages, même dans les grands IDE. Pourquoi donc? Simple, car jusqu'à récemment, il n'y avait pas de conflit (et GCC n'était jamais une alternative). Jusqu'à il y a peut-être un an et demi, si vous aviez besoin d'un code AST de C ++, vous n'aviez pas de chance, ni de milliers de dollars (si vous aviez acheté l'interface EDG).
Konrad Rudolph
5
+1, et pour mémoire, j'écris régulièrement du code C ++ pour les processeurs 8 bits avec 4 Ko de ROM.
avril
2
+1 pour une excellente réponse globale. Ce que je ne comprends pas (je n’ai aucune expérience en la matière), c’est pourquoi (je suppose que nous parlons d’embarqué?) Un compilateur C devrait produire un code exécutable plus petit qu’un compilateur C ++ avec le même ensemble de fonctionnalités que celui utilisé ? Peut-être pourriez-vous fournir des références?
Martin Ba
2
@Martin: le principal est que C ++ inclut la gestion des exceptions, qui (du moins généralement) ajoute un minimum à la taille de l'exécutable. La plupart des compilateurs vous permettent de désactiver la gestion des exceptions, mais lorsque vous le faites, le résultat n'est plus tout à fait C ++. J'imagine que le simple fait que de nombreux éditeurs de compilateurs C ++ ne travaillent pas aussi durement pour produire le code de sortie le plus petit possible a également un effet.
Jerry Coffin
3
"Nous avons constaté que l'utilisation de C ++ au lieu de C se traduisait par une qualité logicielle améliorée et un effort de maintenance réduit ...", conclut-il.
Stephane Rolland
24

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

Casey Patton
la source
51
-1pour le coup de gueule de Linus. : - {
OSMŒ
12
Ne pas moins un moi pour ça! Haha. Je ne suis pas d'accord avec Linus, mais c'est un très bon exemple de POURQUOI les gens pourraient choisir le C plutôt que le C ++ (s'ils croient ce que Linus croit). Je ne commente pas la légitimité de ces raisons.
Casey Patton
10
@ CaseyPatton: Fondamentalement, je vote par voix contre chaque réponse qui présente ce discours rhétorique sans commentaire comme s'il s'agissait d'un véritable argument.
sbi
11
@Coder: Vous n'avez pas du tout besoin de connaître la mise en œuvre de la STL. L'intérêt même de la STL est que vous n'avez pas à connaître l'implémentation, à moins de vous fier à un comportement non défini par la norme. Dans ce cas, pourquoi utiliser la bibliothèque standard? De plus, il est plus qu'un peu fou de ne pas aimer un langage en raison de la façon dont ses développeurs se comportent. Les programmeurs C se comportent comme si C était un don de Dieu à l'homme et étaient trop aveugles pour comprendre la vérité évidente selon laquelle C ++ offre des fonctionnalités fondamentalement et intrinsèquement directement supérieures à C, comme RAII.
DeadMG
8
@ Coder: Si vous vous retrouvez avec autant de shared_ptrs sur un seul objet que vous dépassez le compteur interne, vous le faites mal. La norme spécifiera une taille minimale pour le compteur - probablement 32 bits - et il est assez irréaliste de devoir disposer de plus de 2 milliards de shared_ptrs pour un seul objet. Même si l'objet lui-même avait une taille égale à 0 et que vous disposiez d'un allocateur de mémoire zéro système, vous utilisiez toujours 16 Go de mémoire, uniquement sur shared_ptrs.
DeadMG
13

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.

DeadMG
la source
1
Après votre raisonnement, la question initiale n’a aucun sens et il convient donc de la clore. J'imagine que la question devrait être lue comme suit: quand devrions-nous nous limiter au sous-ensemble C de C ++ (utilisez-vous C) et quand est-il judicieux d'utiliser du C ++ intégral?
Giorgio
C'est vrai, mais seulement dans le cas d'une personne travaillant sur son propre petit projet. Dans la vraie vie, presque tout le monde passe peut-être la moitié de son temps à travailler sur le code des autres. Malheureusement, la plupart des autres "pensent mal" en ce qui concerne ces raisons totalement irrationnelles.
DarenW 10/10
1
@DeadMG: Comment les allocateurs sont-ils censés signaler les erreurs sans générer d'exceptions? En outre, l’ajout de fonctionnalités n’est pas nécessairement préférable lorsque cela ne fait que renforcer la complexité ou la redondance.
Mankarse
@Mankarse: Si vous compilez avec les options permettant de désactiver les exceptions, les allocateurs abandonnent le programme ou utilisent joyeusement un pointeur null, selon l'implémentation de la bibliothèque.
Zan Lynx
4
@Mankarse: Depuis mon expérience en 2007, lorsque j'essayais de faire fonctionner un système Linux avec 1 Go de RAM et sans échange, presque tous les logiciels de bureau échouaient de manière horrible, même quand l'allocation de mémoire échouait.
Zan Lynx
9

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 la Foodéfinition du constructeur de la classe (et des classes dont il dépend). C'est aussi pourquoi la convention est d'écrire ++itau 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 ++:

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

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 stringtype 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 getsou via scanfles spécificateurs de conversion %set %[). 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 mallocet free, 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 ++

John Bode
la source
2
La gestion de la mémoire est complexe et sujette aux erreurs dans certains cas, mais en particulier dans le monde intégré, il est souvent pratique d'écrire des programmes C en utilisant une allocation de mémoire entièrement statique. Si le programme est lié, il ne peut pas manquer de mémoire au moment de l'exécution. De telles garanties peuvent-elles être facilement obtenues en C ++?
Supercat
9

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.

stackoverflowuser2010
la source
19
Votre dernière phrase n’est pas une raison pour utiliser C. Vous pouvez appeler des bibliothèques C à partir de C ++.
user207421
2
J'ai utilisé c ++ pour un projet DSP - pas c
BЈовић
9

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.

Coder
la source
12
Et de quelle manière la gestion manuelle de la mémoire est-elle "plus stable" que les abstractions de type C ++, par exemple std::string? Avez-vous déjà essayé de spécifier une plate-forme où shared_ptrle 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.
sbi
12
@Lundin: '"Il doit être stable à 1000%", les implémentations n'autorisent pas l'allocation dynamique de mémoire en premier lieu. Et qu'est-ce qui vous empêche de faire exactement cela en C ++? (Et faire des déclarations générales sur mes connaissances et mon expérience plutôt que de présenter des arguments est une astuce assez rhétorique.)
sbi
10
@Lundin: C'est bien que vous ayez commencé à fournir des arguments plutôt que des rhétoriques. Mais ils sont faibles. Le fait que vous ayez "oublié" l'une des fonctionnalités principales du C ++ (modèles), qui rend le code plus sûr (car il permet l'exécution des algorithmes - et donc échoue - au moment de la compilation , en éliminant les erreurs d'exécution), ne parler en faveur de votre connaissance de la langue que vous jugez. La réduction de C ++ dans un langage OO a déjà été critiquée, et pour de bonnes raisons. (En outre, les classes avec destruction déterministe sont un excellent outil et sont utiles pour gérer des ressources autres que la mémoire.)
sbi 10/10
9
@Lundin Bien sûr, vous ne voudriez pas l'utiliser std::stringsi vous ne voulez pas d'allocation dynamique. Vous utiliseriez std::basic_string<char, std::char_traits<char>, some_allocator_here>.
Luc Danton
10
@Coder: Que penses-tu prouver avec cela? Le premier est simplement un code incorrect (et serait tout aussi mauvais comme des erreurs de rapport que des valeurs renvoyées), le second plaide en faveur de RAII pour un nettoyage manuel auquel tout développeur C ++ décent se réjouirait, et Joel, autant que je le puisse. le respecter, a dit quelques choses avec lesquelles je suis tout à fait en désaccord. Sa fiche pour une seule entrée, une seule sortie, pue un vieux fou mal informé qui ne sera jamais d'accord pour dire que ce qu'il a appris il y a 25 ans est surpassé. (Rappelez - vous, je suis programmais il y a 25 ans, quand SESE était l'état de l'art.)
OSMŒ
6

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:

  • n'utilisez pas plus de mémoire que vous le souhaitez
  • n'accédez pas bon gré mal gré (la vtable peut être n'importe où)
  • ne pas invoquer trop de code accidentellement

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)

Macke
la source
1
Il y a beaucoup de choses que C n'offre pas de contrôle. Essayez d’écrire du code portable efficace pour multiplier uint32_t par un uint32_t afin d’obtenir un résultat uint32_t (32 derniers bits du produit). Si an intest de 64 bits, il faut au moins un opérande pour uint64_tempê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".
Supercat
Ce n'est pas. Le compilateur fait des choses comme enregistrer des allocations pour vous. Je ne peux pas écrire de code maintenable en assembleur, en CI peut.
Nils
2

(é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.

anon
la source
1

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.

Jonathan
la source
0

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

johannes
la source
0

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.

Basile Starynkevitch
la source