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.