web-dev-qa-db-fra.com

Quelles seraient les limitations C ++ par rapport au langage C?

Voici les avantages du C++

  • C++ fournit les fonctionnalités spécifiques qu'ils demandent
  • Leur compilateur C est presque certainement vraiment un compilateur C++, donc il n'y a aucune implication financière
  • 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ù l'on doit utiliser C sur C++?

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

Pas un double, car cette question porte sur les limitations linguistiques et non sur devrait/ne devrait pas apprendre une langue par rapport à une autre.

Le message de Peter Kirkham a été pour moi le plus informatif, en particulier en ce qui concerne les problèmes C99 que je n'avais pas pris en compte, donc je l'ai accepté. Merci à tous les autres participants

116
anon

Ceci est provoqué par une réponse que j'ai donnée à une question actuelle qui pose une question sur une bibliothèque générique pour C - l'interrogateur 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++.

C'est C valide:

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

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

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

qui n'est plus du C valide. (vous pouvez utiliser la distribution de style C, auquel cas elle serait compilée en C, mais être évitée par la plupart des normes de codage C++, et également par de nombreux programmeurs C; assistez aux commentaires "ne pas diffuser malloc" partout dans Stack Overflow) .


Ce n'est pas le même langage, et si vous avez un projet existant en C, vous ne voulez pas le réécrire dans un autre langage juste pour utiliser une bibliothèque. Vous préféreriez utiliser des bibliothèques auxquelles 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 le modèle/en ligne d'une bibliothèque C++.)

Prendre le premier fichier C dans un projet sur lequel je travaille, c'est ce qui se passe si vous échangez simplement gcc std=c99 pour 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 les 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 sur les coûts logiciels

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 à une question recherchant une implémentation de bibliothèque d'une file d'attente en C est plus complexe que suggérer 'utiliser Objective C' et 'appelez la classe Java java.util.Queue utilisant JNI' ou 'appelez la bibliothèque CPython' - L'objectif C est en fait un sur-ensemble approprié de C (y compris C99) et Java et les bibliothèques CPython sont tous deux appelables directement à partir de C sans avoir à porter du code sans rapport avec le 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.

136
Pete Kirkham

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 facilement assez bon pour de telles choses, alors pourquoi utiliser quelque chose de plus grand?

58
Joonas Pulakka

Je déteste la programmation en C++.

49
Georg Schölly

Deux raisons peuvent ê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 des implémentations terribles 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 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 au C.
  • Familiarité. C++ est un langage complexe. Il est plus facile d'enseigner à quelqu'un C que 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 à quelqu'un C++ 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 beaucoup la prise en main.

Je préférerais 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.

38
jalf

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

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 bien qu'il existe de bonnes fonctionnalités en C++ qui facilitent la vie, il y a aussi un tas d'embûches et une sorte de "façon-il-y-a-toujours-meilleure" de faire les choses. En fait, vous n'êtes jamais vraiment satisfait de la solution que vous avez faite. (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 sans doute 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 "Nice" et "pretty", généralités, etc.

Ce que j'ai découvert en retournant à C, c'est que c'était à nouveau une programmation amusante. Ayant passé tellement 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'autodiscipline. Mais il est très facile de mettre trop d'abstractions sur du code simple, ce qui n'est jamais vraiment nécessaire.

30
Anders Hansson

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 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érateur qui peut avoir un comportement surprenant même lorsqu'il n'est pas mal utilisé. J'avoue que je suis un maniaque du contrôle, mais je suis arrivé à la conclusion que ce n'est pas une si mauvaise habitude pour un développeur de logiciels qui veut écrire des logiciels fiables. Je veux juste avoir une bonne chance de dire que mon logiciel fait exactement ce qu'il est censé faire et ne pas avoir de mauvaise sensation dans l'estomac en même temps parce que je sais qu'il pourrait y avoir tellement de bugs que je ne le ferais pas. t même remarqué quand j'ai regardé le code qui les provoque.

C++ a également des modèles. Je les déteste et les aime, mais si quelqu'un dit qu'il 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 de la norme (ce qui devient évident lorsque vous essayez de le lire). Il y a tellement de cas de coin absurdement trompeurs impliqués qu'il n'est tout simplement pas possible 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 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 la mauvaise impression de perdre du temps à lire des messages d'erreur du compilateur de plusieurs 1000 caractères pour dont j'ai besoin déjà 10 minutes ou plus pour comprendre ce que le compilateur veut vraiment 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 lent même sur des machines rapides et nécessite une recompilation de grandes parties du code lorsque vous changez quelque chose.

C++ a également le piège 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 évoluera, en particulier lorsque vous êtes sur le point de développer un Nice et flexible OO conception.

C++ a un typage plus fort que C, ce qui est génial, mais j'ai parfois l'impression de nourrir un Tamagotchi lorsque j'essaie de compiler du code C++. Une grande partie des avertissements et des erreurs que j'obtiens habituellement 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 que quelques-unes des raisons pour lesquelles je n'aime pas le 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'ils soient des hackers C++ très intelligents ou des débutants naïfs. Tout le monde fait des erreurs, mais C++ rend délibérément difficile de les trouver et encore plus difficile de les repérer avant qu'elles ne se produisent.

Avec C++, vous êtes simplement perdu sans utiliser un 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 s'exécutant sur des chemins que je n'aurais jamais anticipés. En fait, j'essaie 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. et d'utiliser un débogueur seulement occasionnellement juste pour voir à quel point il fonctionne bien dans tous les endroits confortables que j'ai préparés pour lui. Il est tout simplement impossible d'écrire et d'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. Donc, vous ne connaissez peut-être pas les bogues des programmes C++, mais cela ne signifie pas qu'ils ne sont pas là. Plus un projet C++ est volumineux, plus il devient faible, 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 que nous avons à portée de main. Finalement, je le jette et recommence avec une autre langue ou une combinaison d'autres langues.

Je pourrais continuer, mais je suppose que j'ai clairement expliqué 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 me fie au 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 qu'être assez bon en C et dans d'autres langages me permet de reconnaître ce que je suis en fait en matière de C++, et que je ne serai jamais en mesure de le comprendre pleinement .

La vie est courte...

27
x4u

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

Parlant de l'expérience d'avoir hérité et conservé les deux: une conception horrible en C est difficile à comprendre, à dérouler et à transformer en quelque chose d'utile.

Une conception horrible en C++ est infiniment pire, car des couches d'abstraction aléatoires envoient votre cerveau se promener dans la base de code en essayant de comprendre 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 conceptions, je préférerais de loin avoir le premier que le second.

20
bstpierre

Je ne vois aucune raison autre que l'aversion personnelle, même pour la programmation de systèmes embarqués et de choses similaires. En C++, vous ne payez des 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 le surcoût de certaines constructions C++. Permettez-moi d'énumérer quelques exemples:

  • Les classes et les fonctions membres ont zéro surcharge 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 des 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 (pas de compilateur C++ du tout, ou un compilateur existe, mais est mal implémenté et impose une surcharge élevée inutile pour certaines fonctionnalités C++).

19
Suma

Pourquoi limiter le parler 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.

13
SPWorley

J'aimerais poursuivre 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 ici est beaucoup plus importante que la première, car décider d'une norme de codage peut facilement devenir une question politique et faire l'objet d'une révision plus tard. Considérons 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é à 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 pour être envisagée et ne serait pas beaucoup mieux de toute façon.)

Bien que j'utilisais 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 d'autres langue entièrement. (Seules les exceptions possibles étant certains domaines de problème spécifiques à hautes performances, wrt. Blitz ++ )

10
TrayMan

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

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

10
Rhythmic Fistman

C++ a une courbe d'apprentissage beaucoup plus longue. C n'a que peu de constructions dont vous devez être conscient et vous pouvez alors commencer à coder un logiciel puissant. En C++, vous devez apprendre la base C, puis la OO et la programmation générique, exception, etc. Et après un certain temps, vous connaissez peut-être la plupart des fonctionnalités et vous pouvez les utiliser de manière adaptable, mais vous Je ne sais toujours pas comment le compilateur les traduira, quelle surcharge implicite 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 encore largement utilisé, les gens choisissent la langue qu'ils aiment et qu'ils peuvent utiliser. Considérez que tous les programmeurs OS ne sont pas des programmeurs professionnels.

10
quinmars

Je n'ai jamais vu d'arguments pour utiliser C sur C++ que je considérerais convaincants. Je pense que la plupart des gens ont peur de certaines fonctionnalités qu'offre C++, souvent à juste titre. Pourtant, cela ne me convainc pas, car on peut imposer l'utilisation ou non de certaines fonctionnalités via des 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 sur C qui aiderait à écrire un meilleur code, ce qui est un point de vue que je considère assez ignorant.

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.

9
Dan Olson

Un point que je n'ai pas encore 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 langue différentes encapsuler les bibliothèques C++.

Par exemple, j'ai appris Le Caire une fois, et l'ai depuis utilisé dans 3 ou 4 langues différentes. Grande victoire! Je préfère écrire un programme qui peut être réutilisé à l'avenir, et en écrire un qui peut 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 pareil. J'ai utilisé Qt (v3 et v4) dans d'autres langages et ce n'est pas du tout 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 signatures de méthode C++ sous forme de chaînes!)

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

9
Ken

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

7
LegendLength

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

6
Paul Dixon

Je peux penser à plusieurs raisons.

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

L'interlocuteur ou les personnes avec lesquelles il travaille peuvent être familiers avec le C mais pas avec le C++.

Le projet peut être en C. Bien qu'il soit possible d'ajouter certaines fonctionnalités C++ à C, cela peut facilement conduire à un gâchis non maintenable. Je suggère de choisir une langue ou l'autre (généralement C++, lorsque cela est possible).

Le questionneur peut avoir une vue obsolète de la courbe d'apprentissage de C++. (Lorsqu'elle est approchée correctement, c'est plus facile que les 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 deviennent de plus en plus différents avec le temps. Le codage des 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++.

4
David Thornley

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 wrappers C sont requis pour le code JNI/non managé et cela rend les choses plus complexes que l'utilisation exclusive de C.

3
weismat

Je pense que C est plus portable. Il y a environ 5 ans, j'ai fait du portage de code vers 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 sur C++ pour cette raison ...

3
Gordon Thompson

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

  • vector et string pour éloigner de moi la gestion de la mémoire de la baie
  • vérification de type stricte et lancers pour avertir et/ou attraper toutes les nuisances qui me manqueraient autrement.

C'est donc C qui emprunte vraiment quelques c ++ mais utilise autant que possible le compilateur c ++. Comme quelqu'un d'autre le dit dans les réponses, je trouve maintenant que je récupère plus de C++ de cette façon et où C serait trop impliqué, j'utilise C++. Surveiller/Verrouiller en utilisant RAII est l'un de ceux que j'ai utilisé récemment pour traiter des programmes multi-threads et une autre construction similaire pour ouvrir/fermer des fichiers.

3
dubnde
  1. C est un langage simple, C++ ne l'est pas. Pour beaucoup de gens, C++ est tout simplement trop compliqué à maîtriser complètement, 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 de la langue. 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++ n'atteint 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 C++.

3
Alan Bradley

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 confinante. Beaucoup de gens sont prêts à risquer d'introduire les types de bogues que C++ peut aider à éviter pour éviter ces "nuisances".

1
Rob deFriesse

La portabilité peut être un problème. Différent de la réponse de Gordon Carpenter-Thomp, je dirais que c'est plutôt le 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 prise en charge 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 d'intercepter 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 pris en charge par GCC avec des fonctionnalités similaires, ces détails sont spécifiés par un ABI C++. Chaque fois que l'ABI utilisé par GCC change, vous vous retrouverez avec des bibliothèques incompatibles produites par les différentes versions de GCC. La même chose est vraie pour le C simple, mais le C ABI est beaucoup plus simple et existe depuis bien plus longtemps, il est donc assez stable.

1
ferdystschenko

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. La seconde est la portabilité: C est un langage plus petit et le code ANSI C se compilera n'importe où. Il est plus facile de rompre la portabilité en C++. Le dernier est la langue elle-même. C++ est plus difficile, et est certainement un langage très mal conçu. Les reproches de Torvalds sont rapportés ci-dessus. Vous pouvez également consulter les réponses aux questions fréquentes C++ ( http://yosefk.com/c++fqa/ ).

1
gappy

La chose la plus utile que j'ai trouvée en C est le manque d'espaces de noms et les 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 grep à travers les fichiers de code source et les résultats de la recherche afficheront les emplacements.

Il est essentiel lors du câblage d'une nouvelle fonctionnalité ou d'un nouveau composant à un système ancien et emmêlé.

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

1
Calmarius

Je peux suivre de nombreuses suggestions ici dans les deux sens. Mais au final, cela revient à a) comparable simple b) complexe comparable.

Je n'ai aucune idée si quelqu'un a "inventé" une sorte de mesure de la complexité du langage.

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

C++ hérite de toute la complexité de C, il ne peut donc pas être inférieur au 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 que plus est toujours mieux?"

1
Friedrich

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 le rend plus adapté aux environnements de bas niveau
  • beaucoup plus facile à interfacer avec d'autres langues
  • prend en charge les tableaux de taille variable sur la pile
  • plus facile à lire le code d'assemblage car il n'y a pas de changement de nom
  • permet de combiner facilement du code produit par différents compilateurs puisqu'il s'agit de l'interface binaire d'application standard de facto
0
dsh

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 le chinois à l'anglais et l'appelle anglais ++, vous ne vous sentiriez probablement pas à l'aise d'ajouter une ligne chinoise à votre dernière lettre d'amour, car il est beaucoup plus facile d'exprimer l'amour dans cette partie de l'anglais ++.

0
Philip

Il existe différentes variantes de tentatives d'amélioration de C dans un langage orienté objet: C++, C # et Objective-C. (Java et ses amis ne sont qu'une saveur de C #, avec encore plus de problèmes)

C # implémenté OO bien et complètement, mais au prix de la possibilité de revenir à la conception procédurale sans introduire de tracas ou d'odeur de code. De plus, l'introduction d'une machine virtuelle a rendu difficile l'écriture de code qui est proche du bas niveau et ne peut jamais être auto-hébergé car la machine virtuelle elle-même doit être implémentée dans un langage qui peut s'exécuter en mode natif. Java est encore plus problématique en faisant des types primitifs en second -order citizen. (En C #, vous avez System.Int32 (un type primitif, int): System.ValueType: System.Object, ce qui fait que les types primitifs sont toujours des objets, mais en Java ne sont pas du tout des objets). Cependant, c'est le plus portable car les binaires compilés qui s'exécutent sous des machines virtuelles sont intrinsèquement compatibles binaires sous différentes plates-formes.

C++ n'utilisait aucune machine virtuelle et conservait les pointeurs C, ce qui le rend toujours adapté au développement du système. (Le noyau d'OS X, Darwin, est en grande partie écrit en C++, mais un sous-ensemble restreint qui n'a pas de modèles, d'héritage multiple ou STL, essentiellement un dialecte d'Objective-C ressemblant à C++. Regardez la documentation IOKit d'OS X et vous découvrirez) Cependant, C++ n'a pas résolu ces problèmes classiques en C tout en introduisant plus de problèmes, y compris les problèmes de portabilité qui sont clairement les plus évidents.

Objective-C est allé à mi-chemin au milieu de C++ et C #, car il s'agit d'un simple mélange de C (n'importe quelle version) et d'un dialecte Smalltalk modifié. Smalltalk, tout comme C #, traite tout comme des objets. Il n'utilise pas non plus une machine virtuelle, et il peut toujours (nécessite!) Utiliser des pointeurs, donc il peut toujours être utilisé comme langage de développement système. (Bizarre pourquoi personne ne le fait? Je veux forker Minix et essayer d'implémenter un noyau avec un assembleur minimal et C, et surtout Objective-C) Avec les bibliothèques appropriées, Objective-C est largement compatible avec le code (c'est-à-dire, nécessite une recompilation mais aucun changement de code) entre les plates-formes, tout comme C.

0
Maxthon Chan
  • Parce que le fournisseur du compilateur fournit uniquement un compilateur C qui est certifié pour les applications critiques pour la sécurité
  • Parce que le C++ FQA fait peur. http://www.yosefk.com/c++fqa/
0
Sebastian