Pourquoi quelqu'un utiliserait-il C plutôt que C ++? [fermé]
132
Bien que les gens semblent aimer se plaindre du C ++, je n'ai pas été en mesure de trouver beaucoup de preuves pour expliquer pourquoi vous voudriez choisir C plutôt que C ++. C ne semble pas avoir autant de critiques et si C ++ a tous ces problèmes, pourquoi ne pouvez-vous pas vous limiter au sous-ensemble C? Quelles sont vos pensées / expériences?
le lien en double exact ne fonctionne plus ..... dit le gars qui est en retard à la fête c :)
kyle
4
C est vraiment meilleur et plus simple en C ++, mais n'importe quel programmeur C peut convertir C ++ en C et rire.
BobRun
11
Ce qui est effrayant, c'est que les gens en général pensent que "++" signifie que c'est vraiment bon, bien désolé que ce ne soit pas le cas.
BobRun
Mis à part les éléments évidents - petits périphériques / embarqués - généralement C est meilleur pour les problèmes de calcul de nombres purs (par exemple, le traitement graphique GPU, les calculs physiques massivement parallèles, l'exploration de motifs, etc.) où les fonctionnalités de POO sont un gonflement. Le C ++ est meilleur pour modéliser les systèmes où les «choses» interagissent, beaucoup plus facilement avec les capacités POO.
Paceman
3
Parce que JavaScript, les meilleures pratiques, le c ++ et la POO sont stupides / trop occupés à essayer de résoudre ces problèmes abstraits qui n'existent probablement pas vraiment ou qui doivent être résolus.
maréchal craft
Réponses:
132
La réponse de Joel est bonne pour les raisons pour lesquelles vous pourriez avoir à utiliser C, bien qu'il y en ait quelques autres:
Vous devez respecter les directives de l'industrie, qui sont plus faciles à prouver et à tester en C.
Vous avez des outils pour travailler avec C, mais pas C ++ (pensez non seulement au compilateur, mais à tous les outils de support, couverture, analyse, etc.)
Vos développeurs cibles sont des gourous C
Vous écrivez des pilotes, des noyaux ou tout autre code de bas niveau
Vous savez que le compilateur C ++ n'est pas bon pour optimiser le type de code que vous devez écrire
Votre application non seulement ne se prête pas à être orientée objet, mais serait plus difficile à écrire sous cette forme
Dans certains cas, cependant, vous voudrez peut - être utiliser C plutôt que C ++:
Vous voulez les performances de l'assembleur sans la peine de coder en assembleur (C ++ est, en théorie, capable de performances `` parfaites '', mais les compilateurs ne sont pas aussi bons pour voir les optimisations qu'un bon programmeur C verra)
Le logiciel que vous écrivez est trivial, ou presque - sortez le petit compilateur C, écrivez quelques lignes de code, compilez et vous êtes prêt - pas besoin d'ouvrir un énorme éditeur avec des aides, pas besoin d'écrire pratiquement des classes vides et inutiles, traitant des espaces de noms, etc. Vous pouvez faire à peu près la même chose avec un compilateur C ++ et utiliser simplement le sous-ensemble C, mais le compilateur C ++ est plus lent, même pour de petits programmes.
Vous avez besoin de performances extrêmes ou d'une petite taille de code, et vous savez que le compilateur C ++ le rendra plus difficile à accomplir en raison de la taille et des performances des bibliothèques
Vous prétendez que vous pouvez simplement utiliser le sous-ensemble C et compiler avec un compilateur C ++, mais vous constaterez que si vous faites cela, vous obtiendrez des résultats légèrement différents selon le compilateur.
Quoi qu'il en soit, si vous faites cela, vous utilisez C. Votre question est-elle vraiment "Pourquoi les programmeurs C n'utilisent-ils pas de compilateurs C ++?" Si c'est le cas, soit vous ne comprenez pas les différences de langage, soit vous ne comprenez pas la théorie du compilateur.
Il y a aussi le standard MISRA C, dont AFAIK n'est pas encore vraiment stable pour C ++.
Paul Nathan
60
La partie performance n'est pas forcément vraie. Il existe de nombreux domaines dans lesquels C ++ peut être optimisé bien mieux que C. (Bien sûr, l'inverse est également parfois vrai, mais en général, choisir C plutôt que C ++ pour des raisons de performances est une mauvaise idée).
jalf
9
Je serais intéressé par plus d'informations sur les performances. Je ne comprends pas pourquoi C ne fonctionnerait mieux que «occasionnellement». Etant donné un programmeur moyen, il se peut que C ++ rende les performances plus faciles à atteindre (bonne utilisation des modèles) mais un programme C écrit par un expert devrait être plus rapide - moins de frais généraux.
Adam Davis
3
Bien sûr, le programme C plus rapide prendrait plus de temps à écrire et à déboguer, il y a donc un compromis, et étant donné la vitesse des machines, le compromis en vaut rarement la peine, sauf pour les applications spécialisées, c'est pourquoi C ++ est généralement meilleur. (au moment où le code est terminé, les ordinateurs sont plus rapides et mangent la différence)
Adam Davis
21
@Adam: C ++ fonctionne mieux que C avec du code "joli". C ++ peut utiliser des modèles et des fonctions en ligne où C a besoin d'une macro. La surcharge C ++ n'apparaît que lorsqu'elle est demandée, sinon c'est la même chose que C. (virtual, try / throw, dynamic_cast). Une grande partie de la surcharge n'apparaît que dans la taille de l'image du programme.
Je suppose qu'il aime aussi avoir des bibliothèques, des livres, des forums disponibles?
gnud
30
j'aime le minimalisme et la simplicité de votre réponse ... :)
Joe DF
8
Se mettre d'accord. C est très simple et "petit". C se ressemble toujours et si vous êtes un nouveau contributeur sur un projet, il est facile de comprendre comment cela fonctionne. c ++ a beaucoup de choses inutiles et lorsque je regarde un projet c ++, je suis tout simplement confus instantanément. Je peux comprendre les gens c ++ (un langage C avec des capacités OO) mais C est juste plus simple et facile.
user69969
1
Je pense aussi que C est un langage bien mieux adapté pour écrire des types de bibliothèques, comme de petites bibliothèques universelles, des langages de script et, oui, des moteurs de rendu.
keebus
65
Parce qu'ils savent déjà C
Parce qu'ils construisent une application intégrée pour une plate-forme qui n'a qu'un compilateur C
Parce qu'ils maintiennent un logiciel hérité écrit en C
Vous écrivez quelque chose au niveau d'un système d'exploitation, d'un moteur de base de données relationnelle ou d'un moteur de jeu vidéo 3D de détail.
Certains microcontrôleurs n'ont que des compilateurs C, ce qui est vraiment nul. Les fonctionnalités de base du C ++ (espaces de noms, classes en plus des fonctions virtuelles, énumérations, déclaration de variables ailleurs qu'en haut de bloc) sont les plus précieuses, à mon humble avis.
Jason S
2
À partir de là, il semble que vous ne choisiriez C que s'il n'y a pas d'alternatives raisonnables.
2
@Joe: mis à part le premier point, cela résume tout. Un grand nombre des langages ultérieurs ont pris C et ont dit: «Hé, nous pouvons faire mieux ».
Joel Coehoorn
1
D'accord. Si vous n'utilisez pas les fonctionnalités C ++ sophistiquées, je pense que C ++ est monotone un meilleur C. Avec les fonctionnalités C ++ plus sophistiquées, les choses deviennent plus discutables, mais alors le débat est généralement contre un niveau d'abstraction plus élevé - par exemple, Java.
Paul Nathan
4
La plupart des moteurs de jeux 3D utilisent en fait C ++. UE4 utilise principalement C ++.
Aditya Kashi
56
Les craintes de performances ou de ballonnement ne sont pas une bonne raison de renoncer au C ++. Chaque langue a ses pièges potentiels et ses compromis - les bons programmeurs en apprennent plus sur ces derniers et, le cas échéant, développent des stratégies d'adaptation, les pauvres programmeurs tomberont dans l'erreur et blâmeront la langue.
Le Python interprété est à bien des égards considéré comme un langage «lent», mais pour des tâches non triviales, un programmeur Python expérimenté peut facilement produire du code qui s'exécute plus rapidement que celui d'un développeur C inexpérimenté.
Dans mon secteur, les jeux vidéo, nous écrivons du code haute performance en C ++ en évitant des choses comme le RTTI, les exceptions ou les fonctions virtuelles dans les boucles internes. Ceux-ci peuvent être extrêmement utiles, mais présentent des problèmes de performances ou de ballonnement qu'il est souhaitable d'éviter. Si nous devions aller plus loin et passer entièrement à C, nous gagnerions peu et perdrions les constructions les plus utiles de C ++.
La principale raison pratique de préférer C est que le support est plus répandu que C ++. Il existe de nombreuses plates-formes, en particulier celles intégrées, qui n'ont même pas de compilateurs C ++.
Il y a aussi la question de la compatibilité pour les vendeurs. Alors que C a une ABI (Application Binary Interface) stable et bien définie, C ++ n'en a pas. L'ABI en C ++ est plus compliqué en raison d'éléments tels que les vtables et les constructeurs / destructeurs, il est donc implémenté différemment avec chaque fournisseur, et même les versions d'une chaîne d'outils de fournisseurs.
En termes réels, cela signifie que vous ne pouvez pas prendre une bibliothèque générée par un compilateur et la lier avec du code ou une bibliothèque d'un autre, ce qui crée un cauchemar pour les projets distribués ou les fournisseurs de middleware de bibliothèques binaires.
"Python interprété est à bien des égards considéré comme un langage" lent ", mais pour des tâches non triviales, un programmeur Python expérimenté peut facilement produire du code qui s'exécute plus rapidement que celui d'un développeur C inexpérimenté." Je suppose qu'un programmeur (pas nécessairement un Python Progammer) qui a suivi des cours d'algorithmes peut produire du code qui s'exécute plus rapidement que celui d'un développeur inexpérimenté (en général).
Andrei Ciobanu
15
Et ce même développeur c inexpérimenté produira du code python plus lent que son code c. Python est bien plus lent que c.
Millie Smith
37
J'ai choisi d'écrire en C parce que j'aime travailler avec un petit langage serré. J'aime avoir accès à un standard qui peut être lu dans un laps de temps raisonnable (pour moi - je suis un lecteur très lent). De plus, je l'utilise pour écrire des logiciels pour des systèmes embarqués pour lesquels il existe peu de compilateurs C ++ souhaitables (comme certains micro-contrôleurs PIC).
re: PICs - Je ressens votre douleur. Si jamais je dois faire beaucoup de code PIC, j'utiliserai probablement le compilateur IAR qui prend en charge C ++. Je l'ai utilisé sur le MSP430 et c'est plutôt sympa.
Jason S
1
Et n'oubliez pas les temps de compilation considérablement améliorés pour C. Pas de système de modèle.
Ingénieur
35
Je prends l'autre point de vue: pourquoi utiliser C ++ au lieu de C?
Le livre The C Programming Language (aka: K&R) vous explique clairement comment faire tout ce que le langage peut faire en moins de 300 pages. C'est un chef-d'œuvre du minimalisme. Aucun livre C ++ ne s'en approche.
Le contre-argument évident est que l'on pourrait en dire autant de la plupart, sinon de la totalité, des langues modernes - elles ne peuvent pas non plus vous dire comment tout faire en seulement quelques centaines de pages. Vrai. Alors pourquoi utiliser C ++ à la place? Richesse des fonctionnalités? Puissance? Si vous avez besoin de quelque chose de plus riche en fonctionnalités ou puissant, optez pour C #, Objective C, Java ou autre chose du genre. Pourquoi vous charger des complexités du C ++? Si vous avez besoin du degré de contrôle accordé par C ++, je soutiens que l'utilisation de C. C peut tout faire et bien le faire.
Je suis d'accord. Je veux de la puissance alors j'utilise quelque chose de vraiment puissant, pas le 1/2 point de passage.
Dinah le
7
@Dinah: le point de passage 1/2 vous donne une puissance d'expression de niveau supérieur sans les performances et le coût de la mémoire de C # ou Java.
Zan Lynx
5
@Zan Lynx: vous avez raison. Mais j'espère qu'en prenant la position opposée que j'ai faite dans mon article original, j'ai fait un point sur la viabilité de C sur C ++ ... même si ce n'est, comme vous le faites remarquer, pas un cas ouvert et fermé.
Dinah
28
En plus de plusieurs autres points déjà mentionnés:
Moins de surprise
c'est-à-dire qu'il est beaucoup plus facile de voir ce qu'un morceau de code fera exactement . En C ++, vous devez vous rapprocher du niveau guru pour être capable de savoir exactement quel code le compilateur génère (essayez une combinaison de modèles, d'héritage multiple, de constructeurs générés automatiquement, de fonctions virtuelles et mélangez un peu de magie d'espace de noms et de recherche dépendante des arguments).
Dans de nombreux cas, cette magie est agréable, mais par exemple dans les systèmes en temps réel, cela peut vraiment gâcher votre journée.
Son témoignage est au mieux anecdotique, mais il a raison.
Étant plus un langage de bas niveau, vous le préféreriez au C ++. C ++ est C avec des bibliothèques ajoutées et un support de compilateur pour des fonctionnalités supplémentaires (les deux langages ont des fonctionnalités que l'autre langage n'a pas, et implémentent les choses différemment ), mais si vous avez le temps et l'expérience avec C, vous pouvez bénéficier de pouvoirs supplémentaires supplémentaires liés à bas niveau ... [Modifié] (parce que vous vous habituez à faire plus de travail manuellement plutôt que de bénéficier de certains pouvoirs provenant du langage / compilateur lui-même)
J'ai fait beaucoup de codage en C, puis une brève période de temps en C ++, puis une longue période embarrassante avec VB, et maintenant j'utilise C # depuis quelques années. J'ai écrit un peu de code C et C ++ depuis lors et j'ai réalisé que C est bien défini et serré, C # est cool et puissant, et C ++ est juste nul.
CMPalmer
25
Linus n'est pas vraiment qualifié pour parler des mérites du C ++. Le citer comme s'il était une sorte d'oracle est tout simplement stupide. Et le mot "faire les choses à la dure" n'a pas de sens. Il y a de bonnes raisons d'utiliser C, mais "c'est plus de travail", ou "Linus l'a dit" n'en font pas partie.
jalf
8
@jalf, ne citant pas Linus comme s'il était une sorte d'oracle, il est bon de mentionner l'opinion d'un programmeur connu pour ses choix dans l'un des programmes les plus utilisés au monde: le noyau linux. La question demande des opinions (pourquoi quelqu'un choisirait C) c'est ce à quoi je voulais répondre.
Ric Tokyo
6
Linus est une mauvaise source d'opinions sur C ++ car il ne l'utilise pas et pour autant que je sache, il ne l'a essayé qu'une seule fois en 1990 - quelque chose.
Zan Lynx le
3
@Zan Linus a affiché plus de maîtrise de soi ailleurs: "Nous aurions aimé utiliser C ++ et les fonctionnalités supplémentaires qu'il apporte, mais il est plus difficile de voir où se trouve un mauvais code en C ++ qu'en C". La citation sur ma réponse est un enregistrement d'une opinion plutôt qu'un "suivez le chef".
Ric Tokyo
26
Parce qu'ils écrivent un plugin et que C ++ n'a pas d'ABI standard.
Bien que cela soit vrai, ce n'est pas une raison convaincante de s'en tenir à C car vous pouvez exporter les fonctions nécessaires en utilisant la liaison C tout en conservant votre implémentation en C ++.
codelogic
2
@codelogic - Les projets C ++ ont tendance à exporter beaucoup plus de types et de fonctions que les projets C équivalents. Il est possible de cacher cela dans une bibliothèque partagée finale, mais c'est probablement plus d'efforts que cela ne vaut la peine.
Tom
tbh pas une très bonne réponse mais +1 parce que C ++ n'a pas d'ABI standard (oui .. C ++ craint)
hasen
6
C n'a pas non plus d'ABI standard.
Stephen Canon
25
Les longs temps de compilation peuvent être ennuyeux. Avec C ++, vous pouvez avoir des temps de compilation très longs (ce qui signifie, bien sûr, plus de temps pour Stack Overflow!).
Pourquoi cela a-t-il été rejeté? Je travaille moi-même beaucoup en C ++ et je ne retournerais pas en C, mais il peut en effet avoir des temps de compilation extrêmement longs (pensez aux modèles, par exemple).
Frank
6
J'utilise C ++ pour un vrai travail, mais je prototypais toujours en C en raison des temps de compilation quasi instantanés.
Tom
Hmm, quand c'est fait de la bonne façon, c'est-à-dire ne pas avoir gonflé on-peut-avoir-besoin-de-ces- # comprend et pas-sûr-qui-est-le-droit-inclure-donc-je-vais-les-inclure-tous- # comprend les temps de compilation sont soignés. Lorsque je pirate un ou trois fichiers, il ne me faut que 1 à 2 secondes pour compiler mes 100 projets KLOC.
Sebastian Mach
4
@Tom: Je me demande à quoi ressemble votre vrai travail en C ++, si vous pouvez prototyper en C. N'utilisez-vous pas les capacités de C ++? Peux-tu élaborer?
Sebastian Mach
24
J'ai l'habitude d'utiliser C ++ pour mes projets. Ensuite, j'ai eu un travail où le C brut est utilisé (une base de code évolutive de 20 ans d'un logiciel AV avec une documentation médiocre ...).
Les 3 choses que j'aime en C sont:
Rien n'est implicite: vous voyez ce que votre programme fait exactement ou non. Cela facilite le débogage.
Le manque d'espaces de noms et de surcharges peut être un avantage: si vous voulez savoir où une certaine fonction est appelée, il suffit de grep dans le répertoire du code source et il vous le dira. Aucun autre outil spécial requis.
J'ai redécouvert la puissance des pointeurs de fonction. Fondamentalement, ils vous permettent de faire toutes les choses polymorphes que vous faites en C ++, mais ils sont encore plus flexibles.
+1 Cependant, un tel polymorphisme en C est généralement obtenu via void *, ce qui est dangereux car il désactive toute capacité du compilateur à vérifier si vous faites quelque chose de mal.
gd1
4
@ gd1 En pratique, je ne me souviens pas d'un seul cas où cela a void*causé des problèmes. Il existe de nombreuses techniques de programmation défensives pour se protéger contre les erreurs: placer des assertions partout, ajouter des nombres magiques dans vos structures (dans les versions de débogage), etc. Mais de nos jours, nous avons valgrind, dr. mémoire, et même MSVC instruments le code pour détecter les problèmes, les problèmes de corruption de la mémoire sont donc assez faciles à résoudre.
Calmarius
4
Je n'éprouve presque jamais de corruption de mémoire dans mes programmes, mais si possible, je préférerais que les erreurs soient détectées avant d'exécuter le programme. Casting void*à whatever*quelque chose que le compilateur accepte de bonne foi. Je préfère que mon compilateur ne me fasse pas confiance et ait la possibilité d'appliquer des vérifications de type robustes. Les erreurs de substitution de modèle émises par les compilateurs C ++ sont difficiles à lire, mais au moins les ordures ne se compilent pas.
gd1
1
@ gd1 De retour à votre premier commentaire, je ne sais pas quelle expérience avez-vous avec les techniques procédurales (je vois que vous êtes principalement actif dans les balises OO). Le void*généralement peut être évité. Le modèle typique lors de l'ajout d'un comportement personnalisé passe un pointeur de fonction et un void*pour les données utilisateur. Une interface générique ressemble généralement à ceci. Ensuite, la bibliothèque transmet cela void*à votre rappel sans rien faire d'autre avec. Le plus souvent, vous n'avez pas de données supplémentaires, vous passez donc NULL et ignorez le paramètre utilisateur dans votre rappel. Je présume que vous le saviez.
Calmarius
@Calmarius "Le plus souvent, vous n'avez pas de données supplémentaires" -> C'est en fait l'avantage du polymorphisme. Il est facile de lier des données supplémentaires, sans utiliser de pointeurs vides. Donc, votre excuse est essentiellement "Je n'utilise pas vraiment cette fonctionnalité de toute façon."
user2445507
15
Je suis surpris que personne ne mentionne les bibliothèques. De nombreux langages peuvent être liés aux bibliothèques C et appeler des fonctions C (y compris C ++ avec extern "C"). C ++ est à peu près la seule chose qui peut utiliser une bibliothèque C ++ (définie comme 'une bibliothèque qui utilise des fonctionnalités en C ++ qui ne sont pas en C [telles que des fonctions surchargées, des méthodes virtuelles, des opérateurs surchargés, ...], et n'exporte pas tout via des interfaces compatibles C via extern "C" ').
Parce qu'ils veulent utiliser des fonctionnalités en C99 qui n'ont pas d'équivalents en C ++.
Cependant, il n'y a pas autant de fonctionnalités C99 utiles pour C ++ que les gens le pensent à première vue. Tableaux de longueur variable? C ++ a std :: vectors. Prise en charge des nombres complexes / imaginaires? C ++ a un type complexe basé sur un modèle. Fonctions mathématiques génériques de type? C ++ a surchargé les fonctions mathématiques standard, provoquant le même résultat.
Initialiseurs nommés? Pas en C ++, mais il existe une solution de contournement:
structMy_class_params{int i;long j;
std::string name;My_class_params& set_i(int ii){
i = ii;return*this;}My_class_params& set_j(long jj){
j = jj;return*this;}template<typename STRING>My_class_params& set_name(STRING&& n){
name = std::forward<STRING>(n);return*this;}My_class_params(){// set defaults}};classMy_class{My_class_paramsparams;public:My_class(constMy_class_params& p):params(p){}...};
Entendre entendre! Le manque d'initialiseurs désignés nommés en C ++ me pousse à grimper le mur chaque fois que je dois l'utiliser.
éphémère le
2
Je suis à 100% sur les initialiseurs !!!
Judge Maygarden le
Si vous souhaitez initialiser une structure globale en dehors d'une fonction (vous ne pouvez donc pas .set _ * ()), C ++ vous oblige à utiliser une syntaxe d'initialiseur sans nom ou à écrire un constructeur pour votre structure. Je n'aime aucune de ces options.
éphémère
Il existe également des VLA dans C99 (GCC) qui sont beaucoup plus faciles à utiliser que std:vector.
Vahid Amiri le
10
Parce que pour de nombreuses tâches de programmation, C est plus simple et assez bon. Lorsque je programme des utilitaires légers en particulier, j'ai l'impression que C ++ veut que je construise une supersructure élégante pour lui-même, plutôt que d'écrire simplement le code.
OTOH, pour des projets plus complexes, l'élégance apporte une plus bonne rigueur structurelle solide que celle qui découlerait naturellement de mon clavier.
La plupart des fonctionnalités importantes de c ++ impliquent d'une manière ou d'une autre des classes ou des modèles. Ce sont de merveilleuses fonctionnalités, sauf la façon dont le compilateur les transforme en code objet. La plupart des compilateurs utilisent la transformation des noms, et ceux qui ne font pas quelque chose au moins aussi compliqué.
Si votre système vit seul, comme c'est le cas avec de nombreuses applications, alors C ++ est un bon choix.
Si votre système a besoin d'interagir avec un logiciel qui n'est pas nécessairement écrit en C ++ (le plus souvent en assembleur ou dans les bibliothèques Fortran), vous êtes dans une situation difficile. Pour interagir avec ces types de cas, vous devrez désactiver la modification des noms pour ces symboles. cela se fait généralement en déclarant ces objets extern "C", mais ils ne peuvent pas être des modèles, des fonctions surchargées ou des classes. S'il s'agit probablement de l'API de vos applications, vous devrez les envelopper avec des fonctions d'assistance et maintenir ces fonctions synchronisées avec les implémentations réelles.
Et en réalité, le langage C ++ fournit une syntaxe standard pour des fonctionnalités qui peuvent être facilement implémentées en C.
En bref, la surcharge du C ++ interopérable est trop élevée pour que la plupart des gens le justifient.
Je suis très surpris d'entendre cela parce que j'ai écrit tellement de .DLL en C ++ qui avaient des interfaces externes "C" afin qu'ils puissent être appelés à partir de C ou de tout autre langage CLR. Certes, vous ne pouvez pas simplement exposer les pointeurs de fonction membre, mais ce n'est pas vraiment un problème pour marshaler les données pour l'appel à __cdecl.
Crashworks
1
En fait, vous pouvez exporter du code basé sur des modèles. Il nécessite juste des wrappers de fonction non basés sur un modèle pour chaque type que vous souhaitez utiliser pour éviter les collisions de noms.
Juge Maygarden
8
C'est assez superficiel mais en tant qu'étudiant occupé, j'ai choisi C parce que je pensais que C ++ prendrait trop de temps à apprendre. De nombreux professeurs de mon université n'accepteront pas de missions en Python et j'avais besoin de ramasser quelque chose rapidement.
Une remarque à propos de "utilisez simplement le sous-ensemble de C ++ que vous souhaitez utiliser": le problème avec cette idée est qu'il y a un coût à faire en sorte que tout le monde dans le projet utilise le même sous-ensemble. Ma propre opinion est que ces coûts sont assez élevés pour les projets faiblement couplés (par exemple, les projets open source), et aussi que C ++ a totalement échoué à être un meilleur C, en ce sens que vous ne pouvez pas utiliser C ++ partout où vous avez utilisé C.
Oh mon Dieu, C vs C ++, un excellent moyen de lancer une guerre des flammes. :)
Je pense que C est meilleur pour le pilote et le code intégré.
C ++ a quelques fonctionnalités intéressantes que C n'a pas, mais de nombreuses fonctionnalités orientées objet de C ++ peuvent causer des problèmes de codage monumentaux lorsque les gens écrivent du code avec des effets secondaires non évidents qui se produisent dans les coulisses. Le code fou peut être caché dans les constructeurs, les destructeurs, les fonctions virtuelles, ... La beauté du code C est que le langage ne fait rien de non-évident dans votre dos, vous pouvez donc lire le code et ne pas avoir à rechercher chaque constructeur et destructeur etc. Une grande partie du problème vient des mauvaises pratiques de codage de CERTAINES personnes.
Mon langage parfait serait une combinaison de C99 et d'un sous-ensemble minimal de capacités C ++ plus sûres qui ajoutent une surcharge du compilateur ZERO (ou presque zéro) à la sortie binaire. Les ajouts parfaits seraient l'encapsulation de classe et les concepts de dénomination des données et des fonctions.
Je n'ai pas été en mesure de trouver beaucoup de preuves pour lesquelles vous voudriez choisir C plutôt que C ++.
Vous pouvez difficilement appeler ce que je vais dire preuve; c'est juste mon avis.
Les gens aiment C parce qu'il s'intègre parfaitement dans l'esprit du programmeur.
Il existe de nombreuses règles complexes de C ++ [quand avez-vous besoin de destructeurs virtuels, quand pouvez-vous appeler des méthodes virtuelles dans un constructeur, comment la surcharge et le remplacement interagissent-ils, ...], et les maîtriser tous demande beaucoup d'efforts. De plus, entre les références, la surcharge d'opérateurs et la surcharge de fonctions, la compréhension d'un morceau de code peut vous obliger à comprendre un autre code qui peut ou non être facile à trouver.
Une question différente sur la raison pour laquelle les organisations préféreraient C au C ++. Je ne sais pas ça, je ne suis qu'un peuple ;-)
Dans la défense du C ++, il apporte des fonctionnalités précieuses à la table; celui que j'apprécie le plus est probablement le polymorphisme paramétrique ('ish), cependant: des opérations et des types qui prennent un ou plusieurs types comme arguments.
++score: Votre déclaration «Les gens aiment C parce qu'il s'intègre parfaitement dans l'esprit du programmeur» est très bien énoncée. Être capable de programmer dans un langage simple où vous savez que ce que vous voyez est ce que vous obtenez est une propriété vraiment attrayante pour un langage de programmation.
tchrist
3
Je dirais que C vous donne un meilleur contrôle sur l'optimisation et l'efficacité que C ++ et serait donc utile dans les situations où la mémoire et les autres ressources sont limitées et où chaque optimisation aide. Il a également une empreinte plus petite bien sûr.
Donc, le même code C compilé à l'aide d'un compilateur C sera plus efficace que s'il était compilé à l'aide d'un compilateur C ++?
Steve Kuo
1
Il y a des années, le noyau Linux pouvait être compilé avec gcc ou g ++, mais g ++ créait du code plus lent ( tux.org/lkml/#s15-3 sous "Enfin, tandis que Linus maintient le noyau de développement ...").
Max Lybbert
Je suppose que je pensais davantage à être en mesure de contrôler davantage la façon dont votre code est optimisé en C plutôt qu'en C ++. Tout comme la façon dont un programmeur utilisant le langage assembleur peut affiner son code plus précisément qu'un autre utilisant un langage de niveau supérieur.
Chris
2
Il y a aussi l'approche adoptée par certains magasins pour utiliser certaines fonctionnalités de C ++ à la manière du C, mais en évitant celles qui sont répréhensibles. Par exemple, en utilisant des classes et des méthodes de classe et une surcharge de fonctions (qui sont généralement faciles à gérer même pour les irréductibles C), mais pas la STL, les opérateurs de flux et Boost (qui sont plus difficiles à apprendre et peuvent avoir de mauvaises caractéristiques de mémoire).
Parce que vous écrivez pour un système où les ressources sont limitées (comme un système embarqué, ou une sorte de véritable code bare metal comme un noyau) et que vous voulez le moins de frais généraux possible.
Il y a une raison pour laquelle la plupart des systèmes embarqués n'ont pas de compilateur C ++ - ce n'est pas que les gens n'en veulent pas, c'est que le fait d'entasser du code C ++ dans ce petit espace est une tâche qui approche impossible.
Pas vraiment un problème de C ++ lui-même en tant que langage, mais le gonflement pathologique que l'utilisation aveugle des modèles peut causer.
Crashworks
1
ecos est en grande partie écrit en C ++. Il n'y a pas de relation entre le langage (par rapport au C) et la taille de l'exécutable (tant que vous savez quelles fonctionnalités utiliser).
user52875
1
"tant que vous savez quelles fonctionnalités utiliser". C'est le point - le résultat de dire "bien, nous avons C ++, mais nous ne pouvons pas supporter la moitié des fonctionnalités du langage pour des raisons de surcharge" est Symbian / C ++, qui confond et met en colère les programmeurs C et les programmeurs C ++ ...
Steve Jessop
1
D'accord sur tous les points. Notre solution pour «savoir quelles fonctionnalités utiliser» consistait simplement à utiliser un compilateur C et à l'appeler un jour. Bien sûr, nous aurions pu faire fonctionner le C ++ (ce qui aurait été vraiment amusant d'une manière super-nerd) mais nous avions un produit à expédier et nous n'avions pas le temps de nous en préoccuper.
Electrons_Ahoy
1
Ce dont C avait besoin était un meilleur préprocesseur. cfront était un et donc né c ++
J'utiliserais C, où le 'c ++ comme préprocesseur' ne serait pas correct.
Je suis à peu près sûr, au bas de toute bibliothèque / framework / toolkit c ++ bien écrit, vous trouverez dirty-old-c (ou statiques, ce qui est le même)
Jusqu'à il y a quelques années, les compilateurs C ++ existants manquaient de fonctionnalités importantes, ou le support était médiocre et les fonctionnalités prises en charge varient énormément entre eux, et il était donc difficile d'écrire des applications portables.
En raison de l'absence de dénomination standard des symboles, il est difficile pour d'autres langages / applications de prendre en charge directement les classes C ++.
Réponses:
La réponse de Joel est bonne pour les raisons pour lesquelles vous pourriez avoir à utiliser C, bien qu'il y en ait quelques autres:
Dans certains cas, cependant, vous voudrez peut - être utiliser C plutôt que C ++:
Vous prétendez que vous pouvez simplement utiliser le sous-ensemble C et compiler avec un compilateur C ++, mais vous constaterez que si vous faites cela, vous obtiendrez des résultats légèrement différents selon le compilateur.
Quoi qu'il en soit, si vous faites cela, vous utilisez C. Votre question est-elle vraiment "Pourquoi les programmeurs C n'utilisent-ils pas de compilateurs C ++?" Si c'est le cas, soit vous ne comprenez pas les différences de langage, soit vous ne comprenez pas la théorie du compilateur.
la source
J'aime le minimalisme et la simplicité.
la source
la source
Les craintes de performances ou de ballonnement ne sont pas une bonne raison de renoncer au C ++. Chaque langue a ses pièges potentiels et ses compromis - les bons programmeurs en apprennent plus sur ces derniers et, le cas échéant, développent des stratégies d'adaptation, les pauvres programmeurs tomberont dans l'erreur et blâmeront la langue.
Le Python interprété est à bien des égards considéré comme un langage «lent», mais pour des tâches non triviales, un programmeur Python expérimenté peut facilement produire du code qui s'exécute plus rapidement que celui d'un développeur C inexpérimenté.
Dans mon secteur, les jeux vidéo, nous écrivons du code haute performance en C ++ en évitant des choses comme le RTTI, les exceptions ou les fonctions virtuelles dans les boucles internes. Ceux-ci peuvent être extrêmement utiles, mais présentent des problèmes de performances ou de ballonnement qu'il est souhaitable d'éviter. Si nous devions aller plus loin et passer entièrement à C, nous gagnerions peu et perdrions les constructions les plus utiles de C ++.
La principale raison pratique de préférer C est que le support est plus répandu que C ++. Il existe de nombreuses plates-formes, en particulier celles intégrées, qui n'ont même pas de compilateurs C ++.
Il y a aussi la question de la compatibilité pour les vendeurs. Alors que C a une ABI (Application Binary Interface) stable et bien définie, C ++ n'en a pas. L'ABI en C ++ est plus compliqué en raison d'éléments tels que les vtables et les constructeurs / destructeurs, il est donc implémenté différemment avec chaque fournisseur, et même les versions d'une chaîne d'outils de fournisseurs.
En termes réels, cela signifie que vous ne pouvez pas prendre une bibliothèque générée par un compilateur et la lier avec du code ou une bibliothèque d'un autre, ce qui crée un cauchemar pour les projets distribués ou les fournisseurs de middleware de bibliothèques binaires.
la source
J'ai choisi d'écrire en C parce que j'aime travailler avec un petit langage serré. J'aime avoir accès à un standard qui peut être lu dans un laps de temps raisonnable (pour moi - je suis un lecteur très lent). De plus, je l'utilise pour écrire des logiciels pour des systèmes embarqués pour lesquels il existe peu de compilateurs C ++ souhaitables (comme certains micro-contrôleurs PIC).
la source
Je prends l'autre point de vue: pourquoi utiliser C ++ au lieu de C?
Le livre The C Programming Language (aka: K&R) vous explique clairement comment faire tout ce que le langage peut faire en moins de 300 pages. C'est un chef-d'œuvre du minimalisme. Aucun livre C ++ ne s'en approche.
Le contre-argument évident est que l'on pourrait en dire autant de la plupart, sinon de la totalité, des langues modernes - elles ne peuvent pas non plus vous dire comment tout faire en seulement quelques centaines de pages. Vrai. Alors pourquoi utiliser C ++ à la place? Richesse des fonctionnalités? Puissance? Si vous avez besoin de quelque chose de plus riche en fonctionnalités ou puissant, optez pour C #, Objective C, Java ou autre chose du genre. Pourquoi vous charger des complexités du C ++? Si vous avez besoin du degré de contrôle accordé par C ++, je soutiens que l'utilisation de C. C peut tout faire et bien le faire.
la source
En plus de plusieurs autres points déjà mentionnés:
Moins de surprise
c'est-à-dire qu'il est beaucoup plus facile de voir ce qu'un morceau de code fera exactement . En C ++, vous devez vous rapprocher du niveau guru pour être capable de savoir exactement quel code le compilateur génère (essayez une combinaison de modèles, d'héritage multiple, de constructeurs générés automatiquement, de fonctions virtuelles et mélangez un peu de magie d'espace de noms et de recherche dépendante des arguments).
Dans de nombreux cas, cette magie est agréable, mais par exemple dans les systèmes en temps réel, cela peut vraiment gâcher votre journée.
la source
La réponse de Linus à votre question est "Parce que C ++ est un langage horrible"
Son témoignage est au mieux anecdotique, mais il a raison.
Étant plus un langage de bas niveau, vous le préféreriez au C ++. C ++ est C avec des bibliothèques ajoutées et un support de compilateur pour des fonctionnalités supplémentaires (les deux langages ont des fonctionnalités que l'autre langage n'a pas, et implémentent les choses différemment ), mais si vous avez le temps et l'expérience avec C, vous pouvez bénéficier de pouvoirs supplémentaires supplémentaires liés à bas niveau ... [Modifié] (parce que vous vous habituez à faire plus de travail manuellement plutôt que de bénéficier de certains pouvoirs provenant du langage / compilateur lui-même)
Ajout de liens:
Pourquoi C ++ pour embarqué
Pourquoi utilisez-vous toujours C? PDF
Je voudrais chercher sur Google pour cela ... car il y a déjà beaucoup de commentaires sur le Web
la source
Parce qu'ils écrivent un plugin et que C ++ n'a pas d'ABI standard.
la source
Les longs temps de compilation peuvent être ennuyeux. Avec C ++, vous pouvez avoir des temps de compilation très longs (ce qui signifie, bien sûr, plus de temps pour Stack Overflow!).
la source
J'ai l'habitude d'utiliser C ++ pour mes projets. Ensuite, j'ai eu un travail où le C brut est utilisé (une base de code évolutive de 20 ans d'un logiciel AV avec une documentation médiocre ...).
Les 3 choses que j'aime en C sont:
Rien n'est implicite: vous voyez ce que votre programme fait exactement ou non. Cela facilite le débogage.
Le manque d'espaces de noms et de surcharges peut être un avantage: si vous voulez savoir où une certaine fonction est appelée, il suffit de grep dans le répertoire du code source et il vous le dira. Aucun autre outil spécial requis.
J'ai redécouvert la puissance des pointeurs de fonction. Fondamentalement, ils vous permettent de faire toutes les choses polymorphes que vous faites en C ++, mais ils sont encore plus flexibles.
la source
void*
causé des problèmes. Il existe de nombreuses techniques de programmation défensives pour se protéger contre les erreurs: placer des assertions partout, ajouter des nombres magiques dans vos structures (dans les versions de débogage), etc. Mais de nos jours, nous avons valgrind, dr. mémoire, et même MSVC instruments le code pour détecter les problèmes, les problèmes de corruption de la mémoire sont donc assez faciles à résoudre.void*
àwhatever*
quelque chose que le compilateur accepte de bonne foi. Je préfère que mon compilateur ne me fasse pas confiance et ait la possibilité d'appliquer des vérifications de type robustes. Les erreurs de substitution de modèle émises par les compilateurs C ++ sont difficiles à lire, mais au moins les ordures ne se compilent pas.void*
généralement peut être évité. Le modèle typique lors de l'ajout d'un comportement personnalisé passe un pointeur de fonction et unvoid*
pour les données utilisateur. Une interface générique ressemble généralement à ceci. Ensuite, la bibliothèque transmet celavoid*
à votre rappel sans rien faire d'autre avec. Le plus souvent, vous n'avez pas de données supplémentaires, vous passez donc NULL et ignorez le paramètre utilisateur dans votre rappel. Je présume que vous le saviez.Je suis surpris que personne ne mentionne les bibliothèques. De nombreux langages peuvent être liés aux bibliothèques C et appeler des fonctions C (y compris C ++ avec extern "C"). C ++ est à peu près la seule chose qui peut utiliser une bibliothèque C ++ (définie comme 'une bibliothèque qui utilise des fonctionnalités en C ++ qui ne sont pas en C [telles que des fonctions surchargées, des méthodes virtuelles, des opérateurs surchargés, ...], et n'exporte pas tout via des interfaces compatibles C via extern "C" ').
la source
Si vous voulez que votre code soit compris par pratiquement n'importe quel programmeur, écrivez en C.
la source
Parce qu'ils veulent utiliser des fonctionnalités en C99 qui n'ont pas d'équivalents en C ++.
Cependant, il n'y a pas autant de fonctionnalités C99 utiles pour C ++ que les gens le pensent à première vue. Tableaux de longueur variable? C ++ a std :: vectors. Prise en charge des nombres complexes / imaginaires? C ++ a un type complexe basé sur un modèle. Fonctions mathématiques génériques de type? C ++ a surchargé les fonctions mathématiques standard, provoquant le même résultat.
Initialiseurs nommés? Pas en C ++, mais il existe une solution de contournement:
Cela vous permet d'écrire des choses comme:
la source
std:vector
.Parce que pour de nombreuses tâches de programmation, C est plus simple et assez bon. Lorsque je programme des utilitaires légers en particulier, j'ai l'impression que C ++ veut que je construise une supersructure élégante pour lui-même, plutôt que d'écrire simplement le code.
OTOH, pour des projets plus complexes, l'élégance apporte une plus bonne rigueur structurelle solide que celle qui découlerait naturellement de mon clavier.
la source
La plupart des fonctionnalités importantes de c ++ impliquent d'une manière ou d'une autre des classes ou des modèles. Ce sont de merveilleuses fonctionnalités, sauf la façon dont le compilateur les transforme en code objet. La plupart des compilateurs utilisent la transformation des noms, et ceux qui ne font pas quelque chose au moins aussi compliqué.
Si votre système vit seul, comme c'est le cas avec de nombreuses applications, alors C ++ est un bon choix.
Si votre système a besoin d'interagir avec un logiciel qui n'est pas nécessairement écrit en C ++ (le plus souvent en assembleur ou dans les bibliothèques Fortran), vous êtes dans une situation difficile. Pour interagir avec ces types de cas, vous devrez désactiver la modification des noms pour ces symboles. cela se fait généralement en déclarant ces objets
extern "C"
, mais ils ne peuvent pas être des modèles, des fonctions surchargées ou des classes. S'il s'agit probablement de l'API de vos applications, vous devrez les envelopper avec des fonctions d'assistance et maintenir ces fonctions synchronisées avec les implémentations réelles.Et en réalité, le langage C ++ fournit une syntaxe standard pour des fonctionnalités qui peuvent être facilement implémentées en C.
En bref, la surcharge du C ++ interopérable est trop élevée pour que la plupart des gens le justifient.
la source
C'est assez superficiel mais en tant qu'étudiant occupé, j'ai choisi C parce que je pensais que C ++ prendrait trop de temps à apprendre. De nombreux professeurs de mon université n'accepteront pas de missions en Python et j'avais besoin de ramasser quelque chose rapidement.
la source
Une remarque à propos de "utilisez simplement le sous-ensemble de C ++ que vous souhaitez utiliser": le problème avec cette idée est qu'il y a un coût à faire en sorte que tout le monde dans le projet utilise le même sous-ensemble. Ma propre opinion est que ces coûts sont assez élevés pour les projets faiblement couplés (par exemple, les projets open source), et aussi que C ++ a totalement échoué à être un meilleur C, en ce sens que vous ne pouvez pas utiliser C ++ partout où vous avez utilisé C.
la source
Oh mon Dieu, C vs C ++, un excellent moyen de lancer une guerre des flammes. :)
Je pense que C est meilleur pour le pilote et le code intégré.
C ++ a quelques fonctionnalités intéressantes que C n'a pas, mais de nombreuses fonctionnalités orientées objet de C ++ peuvent causer des problèmes de codage monumentaux lorsque les gens écrivent du code avec des effets secondaires non évidents qui se produisent dans les coulisses. Le code fou peut être caché dans les constructeurs, les destructeurs, les fonctions virtuelles, ... La beauté du code C est que le langage ne fait rien de non-évident dans votre dos, vous pouvez donc lire le code et ne pas avoir à rechercher chaque constructeur et destructeur etc. Une grande partie du problème vient des mauvaises pratiques de codage de CERTAINES personnes.
Mon langage parfait serait une combinaison de C99 et d'un sous-ensemble minimal de capacités C ++ plus sûres qui ajoutent une surcharge du compilateur ZERO (ou presque zéro) à la sortie binaire. Les ajouts parfaits seraient l'encapsulation de classe et les concepts de dénomination des données et des fonctions.
la source
Vous pouvez difficilement appeler ce que je vais dire preuve; c'est juste mon avis.
Les gens aiment C parce qu'il s'intègre parfaitement dans l'esprit du programmeur.
Il existe de nombreuses règles complexes de C ++ [quand avez-vous besoin de destructeurs virtuels, quand pouvez-vous appeler des méthodes virtuelles dans un constructeur, comment la surcharge et le remplacement interagissent-ils, ...], et les maîtriser tous demande beaucoup d'efforts. De plus, entre les références, la surcharge d'opérateurs et la surcharge de fonctions, la compréhension d'un morceau de code peut vous obliger à comprendre un autre code qui peut ou non être facile à trouver.
Une question différente sur la raison pour laquelle les organisations préféreraient C au C ++. Je ne sais pas ça, je ne suis qu'un peuple ;-)
Dans la défense du C ++, il apporte des fonctionnalités précieuses à la table; celui que j'apprécie le plus est probablement le polymorphisme paramétrique ('ish), cependant: des opérations et des types qui prennent un ou plusieurs types comme arguments.
la source
++score
: Votre déclaration «Les gens aiment C parce qu'il s'intègre parfaitement dans l'esprit du programmeur» est très bien énoncée. Être capable de programmer dans un langage simple où vous savez que ce que vous voyez est ce que vous obtenez est une propriété vraiment attrayante pour un langage de programmation.Je dirais que C vous donne un meilleur contrôle sur l'optimisation et l'efficacité que C ++ et serait donc utile dans les situations où la mémoire et les autres ressources sont limitées et où chaque optimisation aide. Il a également une empreinte plus petite bien sûr.
la source
Il y a aussi l'approche adoptée par certains magasins pour utiliser certaines fonctionnalités de C ++ à la manière du C, mais en évitant celles qui sont répréhensibles. Par exemple, en utilisant des classes et des méthodes de classe et une surcharge de fonctions (qui sont généralement faciles à gérer même pour les irréductibles C), mais pas la STL, les opérateurs de flux et Boost (qui sont plus difficiles à apprendre et peuvent avoir de mauvaises caractéristiques de mémoire).
la source
Parce que vous écrivez pour un système où les ressources sont limitées (comme un système embarqué, ou une sorte de véritable code bare metal comme un noyau) et que vous voulez le moins de frais généraux possible.
Il y a une raison pour laquelle la plupart des systèmes embarqués n'ont pas de compilateur C ++ - ce n'est pas que les gens n'en veulent pas, c'est que le fait d'entasser du code C ++ dans ce petit espace est une tâche qui approche impossible.
la source
Ce dont C avait besoin était un meilleur préprocesseur. cfront était un et donc né c ++
J'utiliserais C, où le 'c ++ comme préprocesseur' ne serait pas correct.
Je suis à peu près sûr, au bas de toute bibliothèque / framework / toolkit c ++ bien écrit, vous trouverez dirty-old-c (ou statiques, ce qui est le même)
la source
la source