Quelles seraient les limitations C ++ par rapport au langage C? [fermé]

116

Voici les avantages du C ++

  • C ++ fournit les fonctionnalités spécifiques qu'ils demandent
  • Leur compilateur C est presque certainement un compilateur C ++, il n'y a donc aucune implication sur les coûts logiciels
  • C ++ est tout aussi portable que C
  • Le code C ++ peut être tout aussi efficace que C (ou plus ou moins)

Y a-t-il des raisons concrètes et des scénarios spécifiques où il faut utiliser C plutôt que C ++?

Référence à cette question: Bibliothèque de génériques en C

Pas un doublon, car cette question porte sur les limites de la langue et non sur le devrait / ne devrait pas apprendre une langue plutôt qu'une autre.

Le post de Peter Kirkham a été pour moi le plus informatif, en particulier en ce qui concerne les questions C99 que je n'avais pas envisagées, donc je l'ai accepté. Merci à tous les autres qui ont participé.

anon
la source
12
Peu importe que cette question soit destinée à être argumentative ou non, elle l'est toujours. Le choix de la langue pour un projet est exactement cela: un choix.
Bombe
7
@bombe ne sommes-nous pas censés discuter de la manière de faire des choix éclairés?
10
N'est-il pas ironique lorsque vous conseillez aux programmeurs C de passer au C ++ qu'ils sont à peu près aussi réceptifs à votre idée que vous le seriez si un programmeur C vous disait que vous devriez abandonner C ++ et passer au C?
Warren P

Réponses:

136

Ceci est incité par une réponse que j'ai donnée à une question actuelle qui pose des questions sur une bibliothèque générique pour C - le questionneur déclare spécifiquement qu'il ne veut pas utiliser C ++.

C est un langage de programmation complet. C n'est pas un sous-ensemble arbitraire de C ++. C n'est pas du tout un sous-ensemble de C ++.

Ceci est valide C:

foo_t* foo = malloc ( sizeof(foo_t) );

Pour le faire compiler en C ++, vous devez écrire:

foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );

ce qui n'est plus valide C. (vous pouvez utiliser le cast de style C, dans ce cas, il compilerait en C, mais serait évité par la plupart des normes de codage C ++, ainsi que par de nombreux programmeurs C; voyez les commentaires "don't cast malloc" partout dans Stack Overflow) .


Ce ne sont pas la même langue, et si vous avez un projet existant en C, vous ne voulez pas le réécrire dans une autre langue juste pour utiliser une bibliothèque. Vous préférez utiliser des bibliothèques avec lesquelles vous pouvez vous connecter dans la langue dans laquelle vous travaillez. (Dans certains cas, cela est possible avec quelques extern "C"fonctions d'encapsuleur, selon la façon dont est modèle / intégré une bibliothèque C ++.)

Prendre le premier fichier C dans un projet sur lequel je travaille, ce qui arrive si vous venez échange gcc std=c99pour g++:

sandiego:$ g++ -g  -O1 -pedantic -mfpmath=sse -DUSE_SSE2 -DUSE_XMM3  -I src/core -L /usr/lib -DARCH=elf64 -D_BSD_SOURCE -DPOSIX -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112L -Wall -Wextra -Wwrite-strings -Wredundant-decls -Werror -Isrc  src/core/kin_object.c -c -o obj/kin_object.o | wc -l
In file included from src/core/kin_object.c:22:
src/core/kin_object.h:791:28: error: anonymous variadic macros were introduced in C99
In file included from src/core/kin_object.c:26:
src/core/kin_log.h:42:42: error: anonymous variadic macros were introduced in C99
src/core/kin_log.h:94:29: error: anonymous variadic macros were introduced in C99
...
cc1plus: warnings being treated as errors
src/core/kin_object.c:101: error: ISO C++ does not support the z printf length modifier
..
src/core/kin_object.c:160: error: invalid conversion from void*’ to kin_object_t*’
..
src/core/kin_object.c:227: error: unused parameter restrict
..
src/core/kin_object.c:271: error: ISO C++ does not support the z printf length modifier
src/core/kin_object.c:271: error: ISO C++ does not support the z printf length modifier

Au total 69 lignes d'erreurs, dont quatre sont des conversions non valides, mais principalement pour des fonctionnalités qui existent en C99 mais pas en C ++.

Ce n'est pas comme si j'utilisais ces fonctionnalités pour le plaisir. Il faudrait un travail considérable pour le porter dans une autre langue.

Il est donc tout à fait faux de suggérer que

[a] Le compilateur C est presque certainement un compilateur C ++, donc il n'y a pas d'implication de coût logiciel

Le portage du code C existant vers le sous-ensemble procédural de C ++ a souvent des implications financières importantes.

Donc, suggérer 'utiliser la classe C ++ std :: queue' comme réponse à la question de recherche d'une implémentation de bibliothèque d'une file d'attente en C est dafter que de suggérer 'utiliser l'objectif C' et 'appeler la classe Java java.util.Queue en utilisant JNI' ou 'appeler la bibliothèque CPython' - Objective C est en fait un sur-ensemble approprié de C (y compris C99), et les bibliothèques Java et CPython peuvent être appelées directement à partir de C sans avoir à porter du code non lié au langage C ++.

Bien sûr, vous pouvez fournir une façade C à la bibliothèque C ++, mais une fois que vous le faites, C ++ n'est pas différent de Java ou Python.

Pete Kirkham
la source
21
Oui. Le plâtre de style C est assez courant lorsque vous utilisez malloc. Lorsque vous utilisez malloc, vous restez dans le sous-ensemble c. Si vous souhaitez programmer le style C ++, vous utiliserez l'opérateur new, et non static_cast + malloc.
Suma
33
Dire que C n'est pas un sous-ensemble de C ++ est incroyablement pédant. Bien sûr, vous pourriez dire que toute structure avec un membre appelé "class" ne sera pas compilée, mais ce ne sont en réalité que des modifications mineures qui sont nécessaires, et la plupart des compilateurs ont des options pour ajouter les quelques fonctionnalités C-only à C ++.
Kaz Dragon
27
en ce qui concerne votre exemple malloc, l'ajout d'un casting ne serait pas seulement évité par les programmeurs C ++, mais aussi (surtout) par les programmeurs C. Il y a de bonnes raisons de laisser de côté la distribution en code C. Ce n'est pas nécessaire et son ajout peut masquer des erreurs. Alors oui, traitez-les comme deux langues distinctes. +1 :)
jalf
26
@BlueRaja Imaginez si Guido avait décidé de ne pas ajouter d'objets à son langage de script, et que deux groupes avaient créé des fourches mutuellement incompatibles de Python pour ajouter des objets, l'un avec un modèle d'objet basé sur Smalltalk, l'autre avec un système de classes basé sur Simula. Ensuite, Guido a continué à améliorer Python en se concentrant sur son utilisation principale. C'est plus proche de la situation C / Objective C / C ++.
Pete Kirkham le
11
@BlueRaja: Ce sont deux langues distinctes qui partagent un noyau commun assez large. Si vous programmez dans ce noyau commun, vous allez finir par faire des choses qui ne sont pas du bon code dans les deux langues. Choisissez une langue dans laquelle écrire un programme donné et faites-le bien dans cette langue.
David Thornley
115

Je me rends compte que ce n'est ni une réponse professionnelle ni une bonne réponse, mais pour moi c'est simplement parce que j'aime vraiment C.C est petit et simple et je peux insérer tout le langage dans mon cerveau, C ++ m'a toujours semblé être un énorme désordre tentaculaire avec toutes sortes de couches, j'ai du mal à grokking. Pour cette raison, je trouve que chaque fois que j'écris en C ++, je finis par passer beaucoup plus de temps à déboguer et à me cogner la tête contre des surfaces dures que lorsque je code C. Encore une fois, je me rends compte que cela est en grande partie le résultat de ma propre «ignorance».

Si je peux choisir, j'écrirai tous les éléments de haut niveau comme l'interface et l'interaction de la base de données en python (ou peut-être C #) et tout ce qui doit être rapide en C. Pour moi, cela me donne le meilleur de tous les mondes. Tout écrire en C ++ donne l'impression de tirer le pire de tous les mondes.

Edit: Je voudrais ajouter que je pense que C avec quelques fonctionnalités C ++ est en grande partie une mauvaise idée si vous allez être plusieurs personnes travaillant sur un projet ou si la maintenabilité est la priorité. Il y aura désaccord sur ce qui constitue un «quelques» et quels bits devraient être faits en C et quels bits en C ++ conduisant finalement à une base de code très schizophrène.

dagw
la source
24
J'ai utilisé C ++ pendant plusieurs années et j'ai encore passé 50% de mon temps à refactoriser le code pour qu'il soit "C ++ correct". C'est un cauchemar, comme tu le dis.
Kai
12
Vous pouvez toujours le faire correctement du premier coup. L'ajout de const n'est pas difficile.
GManNickG
14
J'ai utilisé C ++ pendant dix ans, et revenir au C (pour les systèmes embarqués dans mon cas) a été la meilleure chose que j'ai jamais faite.
Warren P
J'adore cette réponse. Vous avez aussi cloué mes sentiments. J'ai eu des années de travail en tant que développeur C ++, mon travail quotidien est toujours C ++. Mais cela ne veut pas dire que j'aime la langue, je vois la beauté en C.
Matt Joiner
10
+1, En raison de cela , je trouve que chaque fois que j'écris C ++ je finis par passer beaucoup plus de temps de débogage et taper la tête contre les surfaces dures que quand je le code C . Je ne peux pas être plus d'accord avec toi. La meilleure réponse. :)
ApprenticeHacker
58

C ++ n'est tout simplement pas pris en charge dans certains environnements du monde réel, comme les systèmes embarqués de bas niveau. Et il y a une bonne raison à cela: C assez bien pour de telles choses, alors pourquoi utiliser quelque chose de plus grand?

Joonas Pulakka
la source
2
Droite. J'ai vu des compilateurs c pour des micro-contrôleurs 8 bits.
dmckee --- ex-moderator chaton
6
bien sûr. La plupart des puces 8 bits, sinon toutes, ont des compilateurs C de nos jours.
Eli Bendersky
gbdk.sourceforge.net - GBDK pour un ..
Kelden Cowan
+1 c'est la bonne réponse. Les compilateurs C ++ sont beaucoup plus difficiles à écrire que les compilateurs C, en grande partie à cause de la complexité de l'héritage (multiple).
BlueRaja - Danny Pflughoeft
9
@BlueRaja: comparé aux modèles ... l'héritage multiple n'est peut-être pas le vrai dissuasif ici. Après tout, les modèles constituent un langage à part entière.
Matthieu M.
49

Je déteste la programmation en C ++.

Georg Schölly
la source
6
Lol j'aime celui-là
Tamas Czinege
30
Très convaincant! Je pense passer à Python en fonction de votre argument.
Jimmy J
8
Peut-être pas convaincant, mais c'est la vraie raison.
Georg Schölly
@Jimmy J: Python est incroyable. C'est le meilleur d'Unix, C et toutes vos fonctionnalités de langage "modernes" bien faites. Si vous rencontrez des problèmes de performances, Python veut que vous passiez en C, et le fait facilement.
Matt Joiner
2
@Georg: J'avoue que je n'ai jamais jeté un coup d'œil, je suis tellement impressionné par Python.
Matt Joiner
38

Quelques raisons pourraient être:

  • Manque de support - Tous les compilateurs C ne sont pas également des compilateurs C ++. Tous les compilateurs ne sont pas particulièrement conformes à la norme, même s'ils prétendent prendre en charge C ++. Et certains compilateurs C ++ génèrent du code désespérément gonflé et inefficace. Certains compilateurs ont de terribles implémentations de la bibliothèque standard. Le développement en mode noyau rend généralement impossible l'utilisation de la bibliothèque standard C ++, ainsi que de certaines fonctionnalités du langage. Vous pouvez toujours écrire du code C ++ si vous vous en tenez au cœur du langage, mais il peut être plus simple de passer en C.
  • Familiarité. C ++ est un langage complexe. Il est plus facile d'enseigner le C à quelqu'un que le C ++, et il est plus facile de trouver un bon programmeur C qu'un bon programmeur C ++. (le mot clé ici est "bon". Il y a beaucoup de programmeurs C ++, mais la plupart d'entre eux n'ont pas appris le langage correctement)
  • Courbe d'apprentissage - Comme ci-dessus, enseigner le C ++ à quelqu'un est une tâche énorme. Si vous écrivez une application qui doit être maintenue par d'autres à l'avenir, et que ces autres ne sont peut-être pas des programmeurs C ++, l'écrire en C facilite grandement la prise en main.

Je préfère toujours écrire en C ++ quand je peux m'en tirer, et dans l'ensemble, je pense que les avantages l'emportent sur les inconvénients. Mais je peux aussi voir l'argument pour utiliser C dans certains cas.

jalf
la source
4
J'ajouterais que le code C se compile beaucoup plus rapidement que C ++. Un énorme projet dans notre entreprise (plus d'un million de lignes) se compile en moins de 30 secondes.
Calmarius
31

Il y a beaucoup d'arguments sur la programmation embarquée, les performances et tout, je ne les achète pas. C ++ se compare facilement à C dans ces domaines. Toutefois:

Tout récemment, après avoir programmé en C ++ pendant plus de 15 ans, j'ai redécouvert mes racines C. Je dois dire que s'il existe de bonnes fonctionnalités en C ++ qui facilitent la vie, il y a aussi un tas de pièges et une sorte de "il y a toujours une meilleure façon de faire les choses". Vous n'êtes jamais vraiment satisfait de la solution que vous avez apportée. (Ne vous méprenez pas, cela pourrait être une bonne chose, mais surtout pas).

C ++ vous donne des coups de feu infinis. Ce qui pourrait être bon, mais d'une manière ou d'une autre, vous finissez toujours par en utiliser trop. Cela signifie que vous déguisez vos solutions avec des couches d'abstractions «sympas» et «jolies», de généralité, etc.

Ce que j'ai découvert en retournant à C, c'est que c'était à nouveau une programmation amusante. Ayant passé tant de temps à modéliser et à réfléchir à la meilleure façon d'utiliser l'héritage, je trouve que la programmation en C rend mon code source plus petit et plus lisible. Cela dépend bien sûr de votre niveau d'auto-discipline. Mais il est très facile de mettre trop d'abstractions sur du code simple, ce qui n'est jamais vraiment nécessaire.

Anders Hansson
la source
8
Aucune infraction, mais cela peut aussi dépendre de ce que vous pensez être C ++. L'héritage est quelque chose que j'associe plus à Java qu'au C ++, et si vous traitez C ++ strictement comme un langage POO à la Java (C avec classes), alors je suis d'accord avec vous. Si vous vous en tenez à une saveur plus moderne de C ++, je pense que c'est plus amusant que C
jalf
11
Encore une fois, je ne considère pas C ++ comme un langage OO, et il ne devrait pas être traité comme tel. Je pense que la programmation générique est un trait beaucoup plus fort du C ++. La plupart du code C ++ que je vois n'essaye pas particulièrement d'être "OO" ou de contenir du code inutile. C'est souvent plus maigre que le code C équivalent
jalf
3
@jalf: Une autre chose que je trouve peut devenir une distraction "il y a toujours un meilleur moyen" en C ++ est de généraliser les choses avec des modèles. "Peut-être devrions-nous laisser l'utilisateur de cette classe décider quel type d'entier sous-jacent utiliser?" Mais vous n'en avez probablement pas besoin , et en C, vous ne vous embêteriez pas. Et parfois je me surprends à penser: «Nous devrions vraiment fournir une interface d'itérateur vers l'avant à cette classe», alors qu'en C vous exposeriez simplement un pointeur vers le premier élément et un compte, ou (la hauteur de la fantaisie!) Une fonction prenant un pointeur de fonction de rappel.
j_random_hacker
2
Je trouve que prendre du recul lors du codage en C ++ aide. Décidez de l'objectif et écrivez-y (style C). Prenez en compte les ismes C ++ lorsque leur utilité devient apparente.
Matt Joiner
2
infinite gunfire, ooh ouais, si vrai. Nos pieds tremblent littéralement :)
quetzalcoatl
27

C a le principal avantage que vous pouvez simplement voir ce qui se passe réellement lorsque vous regardez un morceau de code (ouais préprocesseur: compilez avec -E et ensuite vous le voyez). Quelque chose qui est trop souvent faux lorsque vous regardez du code C ++. Là, vous avez des constructeurs et des destructeurs qui sont appelés implicitement en fonction de la portée ou en raison d'affectations, vous avez une surcharge d'opérateurs qui peut avoir un comportement surprenant même si elle n'est pas mal utilisée. J'admets que je suis un maniaque du contrôle, mais j'en suis venu à la conclusion que ce n'est pas une si mauvaise habitude pour un développeur de logiciel qui veut écrire un logiciel fiable. Je veux juste avoir une chance de dire que mon logiciel fait exactement ce qu'il est censé faire et ne pas avoir une mauvaise sensation dans l'estomac en même temps parce que je sais qu'il pourrait encore y avoir tellement de bogues que je ne le ferais pas.

C ++ a également des modèles. Je les déteste et les aime, mais si quelqu'un dit qu'il ou elle les comprend parfaitement, je l'appelle un menteur! Cela inclut les rédacteurs du compilateur ainsi que les personnes impliquées dans la définition du standard (ce qui devient évident lorsque vous essayez de le lire). Il y a tellement de cas de coin absurdement trompeurs impliqués qu'il est tout simplement impossible de les considérer tous pendant que vous écrivez du code réel. J'adore les modèles C ++ pour leur puissance. C'est vraiment incroyable ce que vous pouvez faire avec eux, mais ils peuvent également conduire aux erreurs les plus étranges et les plus difficiles à trouver que l'on puisse (ne pas) imaginer. Et ces erreurs se produisent réellement et pas même rarement. La lecture des règles impliquées pour résoudre les modèles dans le C ++ ARM fait presque exploser ma tête. Et cela me donne le mauvais sentiment de perdre du temps à lire des messages d'erreur du compilateur de plusieurs 1000 caractères pour lesquels j'ai déjà besoin de 10 minutes ou plus pour comprendre ce que le compilateur veut réellement de moi. Dans le code C ++ (bibliothèque) typique, vous trouvez également souvent beaucoup de code dans les fichiers d'en-tête pour rendre certains modèles possibles, ce qui rend les cycles de compilation / exécution douloureusement lents même sur des machines rapides et nécessite la recompilation de grandes parties du code lorsque vous changez quelque chose Là.

C ++ a également le trap const. Soit vous évitez const pour tous, sauf les cas d'utilisation les plus triviaux, soit vous devrez tôt ou tard le rejeter ou refactoriser de grandes parties de la base de code lorsqu'elle évolue, en particulier lorsque vous êtes sur le point de développer une conception OO agréable et flexible.

C ++ a un typage plus fort que C, ce qui est génial, mais parfois j'ai l'impression de nourrir un Tamagotchi lorsque j'essaye de compiler du code C ++. Une grande partie des avertissements et des erreurs que je reçois généralement ne sont pas vraiment moi qui fais quelque chose qui ne fonctionnerait pas, mais juste des choses que le compilateur n'aime pas que je fasse de cette façon ou non sans lancer ou mettre des mots-clés supplémentaires ici et Là.

Ce ne sont là que quelques-unes des raisons pour lesquelles je n'aime pas C ++ pour les logiciels que j'écris seul en utilisant uniquement des bibliothèques externes prétendument robustes. La véritable horreur commence lorsque vous écrivez du code en équipe avec d'autres personnes. Peu importe qu'il s'agisse de hackers C ++ très intelligents ou de débutants naïfs. Tout le monde fait des erreurs, mais C ++ rend délibérément difficile leur recherche et encore plus difficile de les repérer avant qu'elles ne surviennent.

Avec C ++, vous êtes simplement perdu sans utiliser de débogueur tout le temps mais j'aime pouvoir vérifier l'exactitude de mon code dans ma tête et ne pas avoir à compter sur un débogueur pour trouver mon code fonctionnant sur des chemins que je n'aurais jamais anticipés. J'essaie en fait d'exécuter tout mon code dans ma tête et d'essayer de prendre toutes les branches qu'il a, même dans les sous-programmes, etc. Écrire et exécuter tant de cas de test que tous les chemins de code ont été utilisés dans toutes les combinaisons avec toutes sortes de données d'entrée étranges est tout simplement impossible. Vous ne connaissez peut-être pas les bogues des programmes C ++, mais cela ne veut pas dire qu'ils ne sont pas là. Plus un projet C ++ est volumineux, moins je suis convaincu qu'il n'aura pas beaucoup de bogues non détectés, même s'il fonctionne parfaitement avec toutes les données de test dont nous disposons. Finalement, je le détruis et recommence avec une autre langue ou une combinaison d'autres langues.

Je pourrais continuer mais j'imagine que j'ai déjà clarifié mon point de vue. Tout cela m'a fait me sentir improductif lorsque je programme en C ++ et m'a fait perdre confiance en l'exactitude de mon propre code, ce qui signifie que je ne l'utiliserai plus, alors que j'utilise et compte toujours sur du code C que j'ai écrit plus de 20 il y a des années. Peut-être que c'est simplement parce que je ne suis pas un bon programmeur C ++, ou peut-être que le fait d'être assez bon en C et dans d'autres langages me permet de reconnaître à quel point je suis en fait quand il s'agit de C ++, et que je ne pourrai jamais le comprendre pleinement .

La vie est courte...

x4u
la source
2
+1, je suis entièrement d'accord.
missingfaktor
2
Cela semble remarquablement parallèle à l'argument de Linus. (Moins d'un contexte d'objet = plus facile à comprendre.)
Warren P
20

Dans un environnement embarqué de bas niveau, certains "ingénieurs logiciels" auront une formation en EE et maîtriseront à peine C. Le C ++ est plus complexe et certains de ces types ont simplement peur d'apprendre un nouveau langage. Ainsi, C est utilisé comme le plus petit dénominateur commun. (Avant de suggérer de se débarrasser de ces gars, ils sont au moins aussi importants que les majors CS qui ne comprennent pas les trucs analogiques hardcore.)

Parlant d'expérience pour avoir hérité et maintenu les deux: un design horrible en C est difficile à comprendre, à dérouler et à refactoriser en quelque chose d'utilisable.

Une conception horrible en C ++ est infiniment pire car des couches aléatoires d'abstraction envoient votre cerveau à fouiller dans la base de code en essayant de déterminer quel code va être exécuté dans quelles circonstances.

Si je dois travailler avec des ingénieurs qui, je le sais, ne produiront pas de superbes designs, je préfère de loin le premier plutôt que le second.

Bstpierre
la source
Amen, mon frère. Ayant travaillé avec des sources C produites par des ingénieurs en matériel, je frémis à l'idée de ce à quoi je serais confronté s'ils l'avaient fait en C ++.
Richard Chambers
19

Je ne vois aucune autre raison que l'aversion personnelle, même pour la programmation de systèmes embarqués et autres choses similaires. En C ++, vous ne payez les frais généraux que pour les fonctionnalités que vous utilisez. Vous pouvez utiliser le sous-ensemble C du C ++ dans certaines situations spécifiques où la surcharge C ++ est trop élevée pour vous. Cela dit, je pense que certains programmeurs C surestiment la surcharge de certaines constructions C ++. Permettez-moi de citer quelques exemples:

  • Les classes et les fonctions membres ont une surcharge nulle par rapport aux fonctions normales (sauf si vous utilisez des fonctions virtuelles, auquel cas il n'y a pas de surcharge par rapport à l'utilisation de pointeurs de fonctions)
  • Les modèles ont très peu de frais généraux (le plus souvent pas de frais généraux)

Une raison valable serait lorsque vous programmez pour une plate-forme qui n'a pas de compilateur C ++ décent (aucun compilateur C ++, ou un compilateur existe, mais est mal implémenté et impose une surcharge inutile pour certaines fonctionnalités C ++).

Suma
la source
3
Une classe avec des fonctions virtuelles a plus de surcharge: chaque instance doit transporter un champ supplémentaire pour identifier le type.
bstpierre
6
Plus de frais généraux que quoi? Le type est porté dans le vtbl. Si vous implémentez un mécanisme similaire à l'aide de pointeurs de fonction, vous avez besoin d'au moins un pointeur (ou index, ou autre) pour sélectionner le pointeur de fonction que vous souhaitez utiliser.
Suma
3
bstpierre: Je pense que ce que Suma dit est: qu'il n'a pas plus de frais généraux que d'implémenter manuellement la fonctionnalité vous-même dans C.
Martin York
2
Un pointeur vers les classes vtable est stocké dans chaque instance de la classe.
tstenner le
5
Il y a une surcharge, mais ce que je veux dire, c'est que si vous voulez une résolution de type dynamique, vous avez besoin d'un peu de stockage pour identifier le type, même en C.Si vous ne voulez pas les types dynamiques, vous n'avez pas besoin de payer les frais généraux ( n'utilisez pas de fonctions virtuelles si vous n'en avez pas besoin).
Suma le
13

Pourquoi limiter la parole en anglais? Peut-être seriez-vous un auteur plus créatif en serbe.

C'est le même argument, avec des erreurs évidentes. Si vous avez une tâche et que vos outils confortables la résolvent efficacement, vous utiliserez probablement vos outils confortables pour une bonne raison.

SPWorley
la source
3
Si je parlais à la fois couramment l'anglais et le serbe, je suis sûr que je serais plus créatif. Êtes-vous en désaccord?
2
@Neil en effet, mais l'effort requis pour apprendre le serbe n'est peut-être pas justifié pour résoudre mon blocage de créativité actuel.
slim
2
Je pense qu'Arno met en évidence le fait que vous n'écrivez pas pour le processeur, que vous écrivez pour que vos collègues lisent et que vos autres bibliothèques lient, et ainsi de suite. Après tout, si je voulais juste pour l'expressivité et la vitesse, j'écrirais en OCaml.
Ken
10

C ++ a une courbe d'apprentissage beaucoup plus longue. C n'a que quelques constructions dont vous devez être conscient et vous pouvez ensuite commencer à coder un logiciel puissant. En C ++, vous devez apprendre la base C, puis la programmation OO et générique, les exceptions, etc. Et après un certain temps, vous pouvez connaître la plupart des fonctionnalités et vous pouvez les utiliser, mais vous ne savez toujours pas comment le compilateur va les traduire, quels frais généraux implicites ils ont ou non. Cela prend beaucoup de temps et d'énergie.

Pour un projet professionnel, cet argument peut ne pas compter, car vous pouvez employer des personnes qui connaissent déjà très bien le C ++. Mais dans les projets Open Source, où C est toujours largement utilisé, les gens choisissent le langage qu'ils aiment et ils peuvent l'utiliser. Considérez que tous les programmeurs OS ne sont pas des programmeurs professionnels.

quinmars
la source
1
Euh ... non? Vous apprenez la base C (éventuellement à l'exception des tableaux et de la gestion des chaînes de style C abandonnés en faveur de <vector> et <string>), et vous y allez. Vous pouvez récupérer tout le reste au fur et à mesure. Vous n'avez rien à savoir sur OO, GP ou exceptions pour commencer avec C ++ ...
DevSolar
4
C peut être "plus petit" mais à long terme, il n'est pas plus facile à utiliser. Gestion manuelle de la mémoire? Non merci.
Jimmy J
7
Il n'existe pas de gestion automatique de la mémoire en C ++.
Warren P
3
C ++ ne résout pas le problème de gestion de la mémoire. Juste au moment où vous pensiez maîtriser les pointeurs, C ++ ajoute un modèle d'exception horrible. Venez à la terre C99, sauf pour les structures de données, je suis à peu près certain que je touche à peine malloc. Même alors, je peux "encapsuler" une poignée d'appels malloc. C'est à peu près la même histoire en C ++ (gestion de la mémoire implicite, seulement c'est fait sur le tas au lieu de la pile), seulement avec tout le jazz pointeur intelligent.
Matt Joiner
1
@ereOn: C'est vrai, le commentaire tel que je l'ai écrit il y a 3 ans ne tient plus. :)
Matt Joiner
10

J'aimerais revenir sur la réponse de Dan Olson. Je crois que les gens craignent les fonctionnalités potentiellement dangereuses et contre-productives du C ++, et à juste titre. Mais contrairement à ce que dit Dan, je ne pense pas que le simple fait de décider d'une norme de codage soit efficace, pour deux raisons:

  1. Les normes de codage peuvent être difficiles à appliquer strictement
  2. Il peut être très difficile d'en trouver un bon.

Je pense que la deuxième raison est ici beaucoup plus importante que la première, car le choix d’une norme de codage peut facilement devenir une question politique et faire l’objet d’une révision ultérieure. Prenons le cas simplifié suivant:

  1. Vous êtes autorisé à utiliser des conteneurs stl, mais à ne pas utiliser de modèles dans votre propre code.
  2. Les gens commencent à se plaindre qu'ils seraient plus productifs s'ils étaient simplement autorisés à coder telle ou telle classe de modèle.
  3. La norme de codage est révisée pour permettre cela.
  4. Faites glisser une pente vers une norme de codage trop compliquée que personne ne suit et utilisez exactement le type de code dangereux que la norme était censée empêcher, combinée à une bureaucratie excessive entourant la norme.

(L'alternative selon laquelle la norme n'est pas révisée à l'étape 3 est empiriquement trop improbable à considérer et ne serait pas beaucoup mieux de toute façon.)

Même si j'avais l'habitude d'utiliser C ++ pour à peu près tout il y a quelques années, je commence à sentir fortement que C est préférable dans les tâches de bas niveau qui doivent être gérées par C ou C ++ et tout le reste devrait être fait dans un autre langue entièrement. (Seules les exceptions possibles étant certains domaines problématiques spécifiques à hautes performances, par exemple Blitz ++ )

TrayMan
la source
10

J'utilise C, ou au moins j'exporte une interface C lorsque j'écris du code de bibliothèque.

Je ne veux pas de tracas ABI mal définis.

Fistman rythmique
la source
Même. C strict dans les interfaces uniquement. La dernière chose que je veux, c'est le cadre d'objet ridicule de quelqu'un d'autre qui m'a poussé.
Matt Joiner
9

Je n'ai jamais vu d'arguments pour utiliser C sur C ++ que je considérerais comme convaincant. Je pense que la plupart des gens ont peur de certaines fonctionnalités offertes par C ++, souvent à juste titre. Pourtant, cela ne me convainc pas car on peut imposer l'utilisation ou non de certaines fonctionnalités par le biais de normes de codage. Même en C, il y a beaucoup à éviter. Abandonner complètement C ++ signifie essentiellement qu'il n'offre aucun avantage tangible par rapport au C qui aiderait à écrire un meilleur code, ce qui est une vue que je considère comme assez ignorante.

De plus, les gens semblent toujours soulever la situation des plates-formes où aucun compilateur C ++ n'existe. Certes, C serait approprié ici, mais je pense que vous auriez du mal à trouver une plate-forme comme celle-ci ces jours-ci.

Dan Olson
la source
3
D'accord, les diatribes «C est meilleur que C ++» ne résistent jamais à l'examen.
Jimmy J
6
Je crois que C ++ m'offre TRÈS PEU d'avantages, et ME COÛTE énormément de complexité accidentelle. Je pense qu'il faudrait environ 1500 pages de manuels C ++ et dix ans d'efforts pour devenir aussi compétent en C ++ que je le suis actuellement en C, Pascal, Python et Objective-C. Chacune des langues ci-dessus est environ 20 fois plus orthogonale, compacte et mentalement pratique à utiliser, sans parler de plus puissante, dans les environnements où je les utilise. Il n'y a simplement AUCUNE utilisation rationnellement justifiable du C ++ dans mes environnements de développement habituels.
Warren P
@Warren Vous ne payez que ce que vous utilisez, comme n'importe quelle langue. Si vous n'êtes pas capable de décider comment coder judicieusement en C ++, c'est à vous, pas au langage.
Dan Olson
2
Non. Si vous êtes le seul développeur sur un projet, cela peut être le cas. Mais dès que nous avons deux développeurs, nous avons des batailles. Quoi? Vous insistez sur les conteneurs IoC, alors que je préfère une autre façon de faire des délégués ... Vous aimez trois niveaux de modèles imbriqués, et je préfère zéro modèle. Un gâchis.
Warren P
Je sais que cet article a 10 ans, mais est-il vraiment juste de comparer plus encore C et C ++? Ce sont deux langues séparées et divergentes (depuis C99) et elles ont toutes les deux leurs avantages et leurs inconvénients que chacune couvre. C ++ est difficile à déboguer et à maintenir? L'explication de C vous permet de mieux déboguer. C n'a pas de génériques? C ++ a des génériques! À ce stade, aucune langue n'est meilleure que l'autre.
Nergal
9

Un point que je n'ai pas encore vu soulevé, qui je pense est le plus important:

La plupart des bibliothèques que j'utilise quotidiennement sont des bibliothèques C avec des liaisons pour Python, Ruby, Perl, Java, etc. D'après ce que j'ai vu, il est beaucoup plus facile d'encapsuler des bibliothèques C avec 19 liaisons de langage différentes que wrapper les bibliothèques C ++.

Par exemple, j'ai appris le Caire une fois, et je l'ai depuis utilisé dans 3 ou 4 langues différentes. Grande victoire! Je préfère écrire un programme qui pourra être réutilisé dans le futur, et en écrire un qui puisse facilement être adopté dans d'autres langages de programmation en est un cas extrême.

Je sais qu'il est possible de lier des bibliothèques C ++, mais AFAICT ce n'est pas la même chose. J'ai utilisé Qt (v3 et v4) dans d'autres langues et ce n'est pas aussi agréable à utiliser: ils ont envie d'écrire du C ++ dans un autre langage, pas comme des bibliothèques natives. (Vous devez passer les sigs de la méthode C ++ sous forme de chaînes!)

C ++ est probablement un meilleur langage si vous écrivez une fonction à utiliser une fois, ou si vous pensez que tout le monde est C ++. C semble être un langage plus facile si vous concevez dès le départ pour la portabilité des langues.

Ken
la source
Les "méthodes de transmission sous forme de chaînes!" chose est un défaut de Qt, pas de C ++. Vous pourriez en fait avoir le même mécanisme stupide avec un framework C que vous voudriez. Même les gars de Qt conviennent que cela était une erreur. Il n'y avait tout simplement pas de meilleure alternative dans leur esprit à l'époque et il était trop tard pour la changer quand ils l'ont réalisé.
ereOn
7

Le développement du noyau Windows ne prend pas en charge C ++ (malheureusement).

LégendeLongueur
la source
Comment c'est? Pourquoi? Le binaire produit à partir d'un compilateur C ++ est-il différent d'un compilateur C? Le développement de pilotes n'est-il pas simplement conforme aux API?
Dave Van den Eynde
4
Parce que de nombreuses fonctionnalités C ++ nécessitent un support d'exécution qui n'est peut-être pas trivial à implémenter en mode noyau. D'une part, différentes fonctions d'allocation de mémoire sont utilisées, donc des morceaux de la bibliothèque standard devraient être remplacés. Les exceptions sont généralement mauvaises aussi.
jalf
3
J'ajouterai que Linux Torvalds a heureusement mis à feu toute chance de C ++ sous Linux pour plus de raisons que d'exceptions. Il y a eu quelques OS dans d'autres langages: Java, C ++, assembleur. Seuls les assembleurs ont survécu avec une utilisation raisonnable.
Matt Joiner
Remarquez que c'est pour Visual Studio 2015?
LegendLength
6

Vous pouvez lire une diatribe divertissante sur les raisons pour lesquelles Linus Torvalds favorise C ici

Paul Dixon
la source
6
C'est plus une diatribe à moitié cohérente contre la conception orientée objet qu'une diatribe contre le C ++.
Dan Olson
16
M. Torvalds a une longue liste de choses qu'il n'aime pas, C ++, emacs, Subversion, OO pour n'en citer que quelques-uns. On souhaite parfois , il touche ferait sa lèvre un peu plus
11
Linus aime déclamer et essayer de provoquer et de contrarier les gens. Malheureusement, il n'a pas pris la peine d' apprendre le C ++ avant de déclarer que ça craint. Malheureusement, ses adeptes du culte croient que tout ce qu'il dit doit être vrai.
jalf
9
Le lien était plus pour le divertissement que pour l'éducation
Paul Dixon
6
Preuve que même les génies peuvent parfois être des dolts.
Kaz Dragon
5

Le code natif sur un mac est objective-c. Le code natif sur un PC est c (window.h) ou c ++ (mfc). Ces deux environnements vous permettront d'utiliser c avec peu ou pas de changements. Quand je veux qu'une bibliothèque de code soit multiplateforme, ansi c semble être un bon choix.

Nick Van Brunt
la source
4

Je peux penser à plusieurs raisons.

Il se peut qu'il n'y ait pas de compilateur C ++ satisfaisant. C ++ est un langage beaucoup plus volumineux et j'ai exécuté des compilateurs C sur des systèmes qui ne seraient pas capables de gérer le C ++ moderne.

Le questionneur, ou les personnes avec lesquelles il travaille, peut être familier avec C mais pas C ++.

Le projet peut être en C. Bien qu'il soit possible d'ajouter des fonctionnalités C ++ à C, cela peut facilement conduire à un désordre impossible à maintenir. Je suggérerais de choisir une langue ou une autre (généralement C ++, lorsque cela est pratique).

Le questionneur peut avoir une vue obsolète de la courbe d'apprentissage de C ++. (Lorsqu'il est abordé correctement, c'est plus facile que celui de C. La plupart des livres d'introduction que j'ai vus ne l'abordent pas correctement.)

N'oubliez pas que C et C ++ sont deux langages différents et qu'ils deviennent de plus en plus différents avec le temps. Coder dans les deux à la fois est une mauvaise idée, et l'utilisation d'un sous-ensemble de type C de C ++ manque la plupart des avantages de C ++.

David Thornley
la source
3

Si vous travaillez dans un environnement avec deux langages, vous pouvez utiliser C pour certaines fonctions de bas niveau critiques pour les performances et un langage plus fonctionnel / de haut niveau comme C # / Java pour la logique métier. Si du code C ++ est utilisé pour ces fonctions, des C-Wrappers sont requis pour le code JNI / non managé, ce qui rend les choses plus complexes que l'utilisation de C.

weismat
la source
3

J'utilise C ++ avec la programmation C pour deux raisons:

  • vectoret stringpour me débarrasser de la gestion de la mémoire du tableau
  • vérification de type stricte et moulages pour avertir et / ou attraper toutes les nuisances qui me manqueraient autrement.

C'est donc C qui emprunte vraiment quelques C ++ mais utilise le compilateur C ++ autant que je peux. Comme quelqu'un d'autre le dit dans les réponses, je trouve que maintenant je prends plus de C ++ de cette façon et là où C serait trop impliqué, j'utilise C ++. Surveiller / verrouiller à l'aide de RAII est l'un de ceux que j'ai récemment utilisés pour traiter des programmes multithreads et une autre construction similaire pour ouvrir / fermer des fichiers.

dubnde
la source
3

Je pense que C est plus portable. J'ai travaillé il y a environ 5 ans en portant du code sur de nombreuses versions d'Unix (AIX, Irix, HPUX, Linux). Le code C était facile à porter, mais nous avons eu divers problèmes de portage d'une partie du code C ++. C'était peut-être juste des environnements de développement immatures, mais je préférerais de loin utiliser C plutôt que C ++ pour cette raison ...

Gordon Thompson
la source
1
Il y a quinze ans, j'étais le développeur principal d'un projet C ++ ciblant HPUX, AIX et Solaris. Nous avons eu très peu de problèmes de portabilité C ++ - presque tous ceux que nous avons rencontrés étaient liés aux incompatibilités des appels système C.
1
Il y a moins de dix ans, j'étais sur un projet utilisant HPUX, Solaris et Tru64, utilisant les compilateurs traditionnels. Nos nightlies n'ont jamais été construits. Lorsque nous avons ajouté AIX, nous avons décidé de passer au C ++ standard.
David Thornley
Peut-être que les gens qui ont écrit votre code étaient de meilleurs codeurs que la merde avec laquelle j'ai dû faire face :-)
Gordon Thompson
3
  1. C est un langage simple, C ++ ne l'est pas. Pour beaucoup de gens, C ++ est tout simplement trop compliqué pour être entièrement maîtrisé, voir http://en.wikipedia.org/wiki/C%2B%2B#Criticism .

  2. En raison de la complexité, différents programmeurs ne maîtrisent généralement que différents sous-ensembles du langage. Cela rend la lecture du code des autres douloureuse.

  3. La complexité, les pièges de la langue ajoutent trop de distraction et nuisent parfois à la productivité. Au lieu de me concentrer sur le travail lui-même, je me suis souvent retrouvé à me battre avec la langue elle-même. Java / python sont des alternatives plus productives.

  4. Le débogage d'un code C cassé est généralement beaucoup plus simple que le débogage d'un code C ++ cassé.

  5. Contrairement à Java / C #, la bibliothèque standard C ++ ne dépasse guère la portée de la bibliothèque standard C.

  6. Certains programmeurs célèbres comme Linus Torvalds (Linux) et Richard Stallman (Emacs) n'aiment pas le C ++.

Alan Bradley
la source
3
J'ai envisagé de voter pour votre réponse juste avant de lire l'argument n ° 6.
fuz
1

La plupart des programmeurs tiennent pour acquis que tout le monde considère la qualité comme une priorité. Ce n'est pas toujours le cas. Si vous êtes habitué au C, le C ++ peut sembler en faire trop pour vous dans les coulisses. La rigueur de la vérification de type en C ++ peut également sembler restrictive. Beaucoup de gens sont prêts à risquer d'introduire les types de bogues que C ++ peut aider à éviter pour éviter ces «nuisances».

Rob deFriesse
la source
1
Hmm, la raison pour laquelle je suis passé du C au C ++ (il y a longtemps) était pour la vérification de type plus stricte. J'aime que le compilateur trouve mes erreurs plutôt que l'utilisateur qui subisse un vidage de mémoire.
1

Il y a trois raisons auxquelles je peux penser. La première est que C est plus adapté aux systèmes embarqués, en raison de la petite taille de ses binaires et de la plus grande disponibilité des compilateurs C sur n'importe quel système. Le second est la portabilité: C est un langage plus petit et le code ANSI C se compilera n'importe où. Il est plus facile de briser la portabilité en C ++. Le dernier est la langue elle-même. Le C ++ est plus difficile et est certainement un langage très mal conçu. Les plaintes de Torvalds sont rapportées ci-dessus. Vous pouvez également consulter les réponses aux questions fréquemment posées sur le C ++ ( http://yosefk.com/c++fqa/ ).

gappy
la source
5
Et, si vous êtes intelligent, après avoir regardé la FQA, vous vous rendrez compte que c'est un travail de piratage par quelqu'un qui ne comprend pas vraiment le C ++ mais qui le déteste quand même.
David Thornley
1

La portabilité peut être un problème. Contrairement à la réponse de Gordon Carpenter-Thomp, je suggérerais qu'il s'agit plutôt du support d'exécution de différentes versions de libstdc ++ sur différentes versions Linux / Unix. Voir ce lien pour une bonne discussion à ce sujet. Un petit extrait:

Le code de support d'exécution utilisé par différentes parties d'une application C ++ doit être compatible. Si une partie du programme a besoin de dynamic_cast ou de capturer des objets fournis par une autre, les deux parties doivent s'accorder sur certains détails d'implémentation: comment trouver des vtables, comment dérouler la pile, etc.

Pour C ++ et quelques autres langages supportés par GCC avec des fonctionnalités similaires, ces détails sont spécifiés par une ABI C ++. Chaque fois que l'ABI utilisé par GCC change, vous vous retrouvez avec des bibliothèques incompatibles produites par les différentes versions de GCC. La même chose est vraie pour le C ordinaire, mais l'ABI C est beaucoup plus simple et existe depuis beaucoup plus longtemps, il est donc assez stable.

ferdystschenko
la source
1

Je peux suivre ici de nombreuses suggestions dans les deux sens. Mais en fin de compte, cela revient à a) un complexe comparable simple b) comparable.

Je ne sais pas si quelqu'un a "inventé" une sorte de mesure de la complexité du langage.

Sur une échelle de 0 à 10, j'évaluerais probablement C à 2 ou 3 alors que C ++ serait entre 8-10. Je dirais que C ++ est l'un des langages les plus complexes, mais je ne sais pas par exemple Ada, PL1 ou autre, donc peut-être que ce n'est pas si complexe en comparaison à un autre langage.

C ++ hérite de toute la complexité de C donc il ne peut pas être en dessous du niveau de complexité de C.

Pour ma part, je serais beaucoup plus à l'aise d'utiliser un langage de script et C. Donc, à la fin, il faut répondre à la question suivante. "Est-ce toujours mieux?"

Friedrich
la source
1

La chose la plus utile que j'ai trouvée en C est le manque d'espaces de noms et de surcharges: les noms de fonctions et de symboles sont des identifiants uniques. Pour trouver les endroits où ces symboles sont utilisés, vous pouvez simplement grepparcourir les fichiers de code source et les résultats de la recherche afficheront les emplacements.

C'est essentiel lors du câblage d'une nouvelle fonction ou d'un nouveau composant à un ancien système enchevêtré.

Vous ne pouvez pas faire cela facilement en C ++, sans un outil sophistiqué de création de graphe d'appel.

Calmaire
la source
0

La plupart des gens semblent penser que C et C ++ sont en quelque sorte liés, mais ils se trompent malheureusement. C ++ est un langage complètement différent de C.

En C ++, vous pensez en termes d'objets et comment ils sont liés les uns aux autres. En C, vous pensez en termes d'API. C'est comme la différence entre le jour et le 17.

Une mauvaise analogie: si quelqu'un ajoute du chinois à l'anglais et l'appelle anglais ++, vous ne vous sentirez probablement pas à l'aise d'ajouter une ligne chinoise à votre dernière lettre d'amour, car il est tellement plus facile d'exprimer l'amour dans cette partie de l'anglais ++.

Philippe
la source
0

Voici toutes les raisons pour lesquelles il peut être avantageux de limiter un projet à C:

  • compilation plus rapide car le langage est beaucoup plus simple
  • nécessite moins de support d'exécution, ce qui en fait des environnements de bas niveau plus adaptés
  • beaucoup plus facile à interfacer avec d'autres langues
  • prend en charge les tableaux de taille variable sur la pile
  • code d'assemblage plus facile à lire car il n'y a pas de changement de nom
  • permet de combiner facilement le code produit par différents compilateurs puisqu'il s'agit de l'interface binaire d'application standard de facto
dsh
la source