121 votes

Pourquoi limiter artificiellement votre code au C ?

Cette question fait suite à une réponse que j'ai donnée à une personne de l'Union européenne. question actuelle qui pose la question d'une bibliothèque générique pour le C - l'auteur de la question précise qu'il ne veut pas utiliser le C++. La question que je lui pose, ainsi qu'aux autres personnes qui insistent pour utiliser le C, est la suivante : pourquoi le font-ils alors qu'ils le font ?

  • C++ fournit les caractéristiques spécifiques qu'ils demandent
  • Leur compilateur C est presque certainement en réalité un compilateur C++, ce qui n'a aucune incidence sur le coût du logiciel.
  • Le C++ est tout aussi portable que le C
  • Le code C++ peut être aussi efficace que le C (ou plus, ou moins).

Veuillez noter : Je n'ai pas l'intention d'argumenter - je suis sincèrement intéressé par les motivations du choix de la langue.

Edit : Il a été suggéré qu'il s'agissait d'un doublon, mais je ne le pense pas. Pour clarifier, je m'intéresse aux raisons pour lesquelles les gens se limitent au sous-ensemble C. Par exemple, l'auteur du message auquel j'ai fait référence aurait pu conserver tout son ancien code C et se contenter d'utiliser les conteneurs génériques C++ comme "meilleurs tableaux" - je m'intéresse à la raison pour laquelle les gens sont si réfractaires à cette idée. Je ne suis pas intéressé par les raisons pour lesquelles vous devriez ou ne devriez pas apprendre le C ou le C++.

Le message de Peter Kirkham était pour moi le plus instructif, en particulier en ce qui concerne les questions relatives à la C99 que je n'avais pas prises en compte, et je l'ai donc accepté. Merci à tous les autres participants.

138voto

Pete Kirkham Points 32484

Cette question m'a été inspirée par une réponse que j'ai donnée à une question actuelle portant sur une bibliothèque générique pour le C - l'auteur de la question indique spécifiquement qu'il ne veut pas utiliser le 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 un C valide :

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

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

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

qui n'est plus un C valide. (Vous pourriez utiliser le cast de style C, auquel cas il compilerait en C, mais serait évité par la plupart des normes de codage C++).

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érez utiliser des bibliothèques auxquelles vous pouvez vous connecter dans le langage dans lequel vous travaillez.

Si l'on prend le premier fichier C d'un projet sur lequel je travaille, voici ce qui se passe si l'on intervertit 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 invalides, mais surtout pour des fonctionnalités qui existent en C99 mais pas en C++.

Ce n'est pas comme si j'utilisais ces fonctions pour le plaisir. Il faudrait beaucoup de travail pour le porter dans une autre langue.

Il est donc tout simplement faux de suggérer que

[un] compilateur C est presque certainement en réalité un compilateur C++, ce qui n'a pas d'incidence sur le coût du logiciel.

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

Donc, suggérer utiliser la classe C++ std::queue". pour répondre à une question, il est plus difficile de trouver une bibliothèque qui implémente une file d'attente en C que de suggérer utiliser l'objectif C et Appeler la classe Java java.util.Queue en utilisant JNI. ou appeler la bibliothèque CPython - Objective C est en fait un sur-ensemble du C (y compris le C99), et les bibliothèques Java et CPython sont toutes deux appelables directement depuis le 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 faites cela, C++ n'est pas différent de Java ou Python.

120voto

dagw Points 1545

Je me rends compte que ce n'est ni une réponse professionnelle ni une réponse particulièrement bonne, mais pour moi c'est simplement parce que j'aime vraiment le C. Le C est petit et simple et je peux faire tenir tout le langage dans mon cerveau, le C++ m'a toujours semblé être un énorme fouillis tentaculaire avec toutes sortes de couches que j'ai du mal à comprendre. C'est pourquoi, lorsque j'écris du C++, je passe beaucoup plus de temps à déboguer et à me cogner la tête contre des surfaces dures que lorsque je code du C. Encore une fois, je me rends compte que c'est en grande partie le résultat de ma propre "ignorance".

Si je dois choisir, j'écrirai tous les éléments de haut niveau comme l'interface et l'interaction avec la base de données en python (ou éventuellement en C#) et tous les éléments qui doivent être rapides en C. Pour moi, cela me donne le meilleur des mondes. Tout écrire en C++ me donne l'impression d'avoir le pire de tous les mondes.

Edit : J'aimerais ajouter que je pense que C avec quelques fonctionnalités C++ est en grande partie une mauvaise idée si plusieurs personnes travaillent sur un projet ou si la maintenabilité est une priorité. Il y aura des désaccords sur ce qui constitue un "peu" et sur les éléments qui doivent être réalisés en C et ceux qui doivent être réalisés en C++, ce qui aboutira à un code très schizophrène.

60voto

Joonas Pulakka Points 20361

Le 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 : Le C est facilement assez bon pour de telles choses, alors pourquoi utiliser quelque chose de plus gros ?

42voto

Georg Schölly Points 63123

Je déteste programmer en C++.

40voto

jalf Points 142628

Il y a plusieurs raisons à cela :

  • 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 le C++. Et certains compilateurs C++ génèrent un 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 de certaines fonctionnalités du langage. Vous pouvez toujours écrire du code C++ si vous vous en tenez au cœur du langage, mais il peut alors être plus simple de passer au C.
  • Familiarité. Le C++ est un langage complexe. Il est plus facile d'apprendre à quelqu'un le C que le C++, et il est plus facile de trouver un bon programmeur C qu'un bon programmeur C++. (Le mot clé ici est "bon". Il y a beaucoup de programmeurs C++, mais la plupart d'entre eux n'ont pas appris le langage correctement)
  • Courbe d'apprentissage - Comme ci-dessus, enseigner le C++ à quelqu'un est une tâche énorme. Si vous écrivez une application qui devra être maintenue par d'autres personnes à l'avenir, et que ces personnes ne sont pas nécessairement des programmeurs C++, l'écrire en C facilite grandement sa prise en main.

Je préfère toujours écrire en C++ quand je peux le faire, et dans l'ensemble, je pense que les avantages l'emportent sur les inconvénients. Mais je peux aussi comprendre les arguments en faveur de l'utilisation du C dans certains cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X