Pourquoi quelqu’un utiliserait C sur C ++?

Bien que les gens semblent aimer se plaindre du C ++, je n’ai pas été en mesure de trouver beaucoup de preuves pour lesquelles vous voudriez choisir C sur C ++. C ne semble pas avoir autant de flak et si C ++ a tous ces problèmes, pourquoi ne pas vous limiter au sous-ensemble C? Quelles sont vos pensées / expériences?

La réponse de Joel est bonne pour des raisons que vous pourriez avoir à utiliser C, bien qu’il y en ait quelques autres:

  • Vous devez respecter les directives de l’indussortinge, 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, parsing, etc.)
  • Vos développeurs cibles sont des gourous en C
  • Vous écrivez des pilotes, des kernelx ou d’autres codes 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 object, mais serait plus difficile à écrire sous cette forme

Dans certains cas, cependant, vous pourriez vouloir 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 performants pour voir les optimisations qu’un bon programmeur C verra)
  • Le logiciel que vous écrivez est sortingvial, ou presque – sortez le petit compilateur C, écrivez quelques lignes de code, comstackz et vous êtes tous ensemble – pas besoin d’ouvrir un énorme éditeur avec des helpers, pas besoin d’écrire pratiquement classes vides et inutiles, traitent des espaces de noms, etc. Vous pouvez faire presque la même chose avec un compilateur C ++ et simplement utiliser le sous-ensemble C, mais le compilateur C ++ est plus lent, même pour les petits programmes.
  • Vous avez besoin de performances extrêmes ou d’une taille de code réduite, et sachez que le compilateur C ++ rendra la tâche plus difficile en raison de la taille et des performances des bibliothèques.

Vous soutenez que vous pouvez simplement utiliser le sous-ensemble C et comstackr avec un compilateur C ++, mais vous constaterez que si vous le faites, 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 les compilateurs C ++?” Si c’est le cas, vous ne comprenez pas les différences de langage ou vous ne comprenez pas la théorie du compilateur.

J’aime le minimalisme et la simplicité.

  • Parce qu’ils connaissent 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 les anciens logiciels écrits en C
  • Vous écrivez quelque chose au niveau d’un système d’exploitation, d’un moteur de firebase database relationnel ou d’un moteur de jeu vidéo 3D.

Les craintes de performance ou de ballonnement ne sont pas une bonne raison de renoncer au C ++. Chaque langue a ses pièges et ses compromis potentiels – les bons programmeurs en apprennent davantage et, le cas échéant, développent des stratégies d’adaptation, les mauvais programmeurs se heurteront à la langue.

Python interprété est considéré à bien des égards comme un langage “lent”, mais pour les tâches non sortingviales, un programmeur Python qualifié 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 hautes performances en C ++ en évitant des éléments tels que les informations RTTI, les exceptions ou les fonctions virtuelles dans les boucles internes. Celles-ci peuvent être extrêmement utiles mais présentent des problèmes de performance ou de ballonnement qu’il est souhaitable d’éviter. Si nous devions aller plus loin et passer entièrement en C, nous gagnerions peu et perdrions les constructions les plus utiles de C ++.

La principale raison de préférer le C est que le support est plus répandu que le C ++. Il existe de nombreuses plates-formes, en particulier celles embarquées, qui n’ont même pas de compilateur C ++.

Il y a aussi la question de la compatibilité pour les fournisseurs. Bien que C ait une interface ABI (Application Binary Interface) stable et bien définie, ce n’est pas le cas de C ++. L’ABI en C ++ est plus compliqué en raison de choses telles que les vtables et les constructurs / destructors;

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 dissortingbués ou les fournisseurs de middleware de bibliothèques binarys.

Je choisis d’écrire en C parce que j’aime travailler avec un petit langage serré. J’aime avoir access à un standard qui peut être lu dans un délai 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 ++ (comme certains microcontrôleurs PIC).

Je prends l’autre vue: pourquoi utiliser C ++ au lieu de C?

Le livre The C Programming Language (alias: K & R) vous indique clairement comment faire tout ce que la langue peut faire en moins de 300 pages. C’est un chef-d’œuvre de minimalisme. Aucun livre C ++ ne se rapproche même.

Le contre-argument évident est que l’on pourrait dire la même chose de la plupart, sinon de toutes les langues modernes – elles ne peuvent pas non plus vous dire comment tout faire en quelques centaines de pages seulement. 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 en fonctionnalités, optez pour C #, Objective C, Java ou autre. Pourquoi se charger des complexités du C ++? Si vous avez besoin du degré de contrôle des subventions C ++, alors je vous conseille d’utiliser C. C peut tout faire et peut le faire correctement.

Parce qu’ils écrivent un plugin et que C ++ n’a pas d’ABI standard.

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 préféreriez le faire en C ++. C ++ est C avec des bibliothèques et un support de compilateur supplémentaires pour des fonctionnalités supplémentaires (les deux langages ont des fonctionnalités que l’autre langue ne met pas en œuvre ), mais le temps et l’expérience avec C, vous pouvez bénéficier de puissances supplémentaires associées à un faible niveau … [Édité] (parce que vous avez l’habitude de faire plus de travail manuellement plutôt que de bénéficier de certains pouvoirs provenant du langage / compilateur lui-même)

Ajouter des liens:

Pourquoi C ++ pour embarqué

Pourquoi utilisez-vous toujours C? PDF

Je voudrais google pour cela .. car il y a déjà beaucoup de commentaires sur le web

Des temps de compilation longs peuvent être ennuyants. Avec C ++, vous pouvez avoir des temps de compilation très longs (ce qui signifie, bien sûr, plus de temps pour le débordement de la stack!).

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 code fera exactement . En C ++, vous devez approcher le niveau guru pour savoir exactement quel code le compilateur génère (essayez une combinaison de modèles, d’inheritance multiple, de constructeurs automatiques, de fonctions virtuelles et de mélange 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.

J’ai l’habitude d’utiliser C ++ pour mes projets. Ensuite, j’ai trouvé un emploi où le langage C est utilisé (une base de code évoluant depuis 20 ans d’un logiciel AV avec une documentation médiocre …).

Les 3 choses que j’aime dans C sont:

  • Rien n’est implicite: vous voyez ce que votre programme fait exactement ou non. Cela facilite le débogage.

  • L’absence d’espaces de noms et de surcharges peut être un avantage: si vous voulez savoir où une fonction est appelée, passez simplement en revue le répertoire du code source et cela vous le dira. Aucun autre outil spécial requirejs.

  • J’ai redécouvert la puissance des pointeurs de la fonction. Fondamentalement, ils vous permettent de faire tout ce que vous faites en C ++, mais ils sont encore plus flexibles.

Je suis surpris que personne ne mentionne les bibliothèques. Beaucoup de langages peuvent se lier contre les librairies C et appeler les fonctions C (y compris C ++ avec extern “C”). C ++ est à peu près la seule chose qui peut utiliser une librairie C ++ (définie comme «une lib qui utilise des fonctionnalités en C ++ qui ne sont pas en C [telles que les fonctions surchargées, les méthodes virtuelles, les opérateurs surchargés,…] tout à travers des interfaces compatibles C via extern “C” ‘).

Si vous voulez que votre code soit compris par pratiquement tous les programmeurs, écrivez en 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 le C ++ que les gens le pensent à première vue. Tableaux à longueur variable? C ++ a std :: vectors. Prise en charge de nombres complexes / imaginaires? C ++ a un type complexe basé sur des modèles. Fonctions mathématiques génériques? C ++ surchargé les fonctions mathématiques standard, provoquant le même résultat.

Des initialiseurs nommés? Pas en C ++, mais il y a une solution de contournement:

 struct My_class_params { int i; long j; std::ssortingng name; My_class_params& set_i(int ii) { i = ii; return *this; } My_class_params& set_j(long jj) { j = jj; return *this; } template  My_class_params& set_name(STRING&& n) { name = std::forward(n); return *this; } My_class_params() { // set defaults } }; class My_class { My_class_params params; public: My_class(const My_class_params& p) : params(p) { } ... }; 

Cela vous permet d’écrire des choses comme:

 My_class mc(My_class_params().set_i(5).set_name("Me")); 

Car pour de nombreuses tâches de programmation, C est plus simple et suffisant. Lorsque je programme des utilitaires légers en particulier, je peux sentir que C ++ veut que je construise une supersructure élégante pour elle-même, plutôt que de simplement écrire le code.

De plus, pour des projets plus complexes, l’élégance fournit une plus grande rigueur structurelle solide que celle qui découlerait naturellement de mon clavier.

La plupart des fonctionnalités importantes de c ++ impliquent en quelque sorte des classes ou des modèles. Ce sont des fonctionnalités exceptionnelles, sauf pour la façon dont le compilateur les transforme en code object. La plupart des compilateurs utilisent la gestion des noms et ceux qui ne font pas au moins autant de désordre.

Si votre système vit seul, comme c’est le cas avec de nombreuses applications, C ++ est un bon choix.

Si votre système doit interagir avec des logiciels qui ne sont pas nécessairement écrits en C ++ (le plus souvent dans les assembleurs ou les bibliothèques Fortran), vous êtes dans une situation difficile. Pour interagir avec ce type de cas, vous devez désactiver la gestion des noms pour ces symboles. Cela se fait généralement en déclarant ces objects extern "C" , mais alors ils ne peuvent pas être des modèles, des fonctions surchargées ou des classes. Si celles-ci sont susceptibles d’être votre API d’applications, vous devrez les encapsuler avec des fonctions d’assistance et conserver ces fonctions en phase avec les implémentations réelles.

Et en réalité, le langage C ++ fournit une syntaxe standard pour les fonctionnalités qui peuvent être facilement implémentées dans le langage C pur.

En résumé, la surcharge du C ++ interopérable est trop élevée pour que la plupart des gens puissent la justifier.

Une remarque à propos de “utilisez simplement le sous-ensemble de C ++ que vous voulez utiliser”: le problème avec cette idée est que cela a un coût pour faire en sorte que tout le monde dans le projet utilise le même sous-ensemble. À mon avis, ces coûts sont assez élevés pour les projets faiblement couplés (par exemple ceux à code source ouvert), et le fait que C ++ a totalement échoué dans le sens où vous ne pouvez pas utiliser C ++.

C’est assez superficiel mais en tant qu’étudiant occupé, j’ai choisi C parce que je pensais que le C ++ prendrait trop de temps à apprendre. Beaucoup de professeurs de mon université n’acceptent pas les affectations en Python et j’avais besoin de prendre quelque chose rapidement.

Oh mon, C vs C ++, une excellente façon de commencer une guerre de flamme. 🙂

Je pense que C est meilleur pour le pilote et le code incorporé.

C ++ possède de nombreuses fonctionnalités que C ne possède pas, mais de nombreuses fonctionnalités orientées object de C ++ peuvent provoquer des erreurs de codage monumentales lorsque les utilisateurs écrivent du code avec des effets secondaires non évidents qui se produisent derrière les scènes. 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 sans devoir chercher dans chaque constructeur et destructeur etc. Le problème réside en grande partie dans les mauvaises pratiques de codage de certaines personnes.

Mon langage parfait serait une combinaison de C99 plus un sous-ensemble minimal de fonctionnalités C ++ plus sûres qui ajoute une surcharge de compilateur ZÉRO (ou proche de zéro) à la sortie binary. Des 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 sur C ++.

Vous pouvez difficilement appeler ce que je vais dire des preuves; c’est juste mon avis

Les gens aiment C parce que ça rentre parfaitement dans l’esprit du programmeur.

Il y a beaucoup de règles complexes de C ++ [quand avez-vous besoin de destructeurs virtuels, quand pouvez-vous appeler des méthodes virtuelles dans un constructeur, comment interagissent la surcharge et la substitution, …] et les maîsortingser demande beaucoup d’efforts. De plus, entre les références, la surcharge de l’opérateur et la surcharge des fonctions, la compréhension d’un morceau de code peut nécessiter que vous compreniez un autre code qui peut ou non être facile à trouver.

Une question différente sur la raison pour laquelle les organisations préfèrent C sur C ++. Je ne sais pas ça, je suis juste 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 polymorphism paramésortingque (‘ish): opérations et types prenant comme argument un ou plusieurs types.

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 chaque optimisation aide. Il a également un encombrement moindre bien sûr.

Parce que vous écrivez pour un système où les ressources sont restreintes (comme un système embarqué, ou un code réel comme un kernel) et que vous voulez un minimum de charge.

Il y a une raison pour laquelle la plupart des systèmes embarqués ne disposent pas d’un compilateur C ++ – ce n’est pas que les gens n’en veulent pas, c’est que l’imbrication du code C ++ dans ce petit espace est une tâche impossible.

Il y a aussi l’approche que certains magasins utilisent pour utiliser certaines fonctionnalités de C ++ de manière C, mais en évitant celles qui sont répréhensibles. Par exemple, utiliser des classes et des méthodes de classe et une surcharge de fonctions (qui sont généralement faciles à gérer), mais pas la STL, les opérateurs de stream et Boost (plus difficiles à apprendre et avec de mauvaises caractéristiques de mémoire).

Ce qu’il fallait, c’était un meilleur préprocesseur. cfront était un et donc né c ++

J’utiliserais C, où “c ++ comme préprocesseur” ne serait pas correct.

Je suis presque sûr que, au bas de toute bibliothèque / framework / toolkit c ++ bien écrite, vous trouveriez un vieux c-sale (ou des castings statiques, qui sont les mêmes).

  • 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 sockets en charge variaient énormément entre eux, et il était difficile d’écrire des applications portables.
  • En raison de la dénomination standard des symboles, il est difficile pour les autres langages / applications de prendre en charge directement les classes C ++.