Ceci est incité par une réponse que j'ai donnée à une question actuelle qui pose des questions sur une bibliothèque générique pour C - le questionneur 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 ++.
Ceci est valide C:
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) ) );
ce qui n'est plus valide C. (vous pouvez utiliser le cast de style C, dans ce cas, il compilerait en C, mais serait évité par la plupart des normes de codage C ++, ainsi que par de nombreux programmeurs C; voyez les commentaires "don't cast malloc" partout dans Stack Overflow) .
Ce ne sont pas la même langue, et si vous avez un projet existant en C, vous ne voulez pas le réécrire dans une autre langue juste pour utiliser une bibliothèque. Vous préférez utiliser des bibliothèques avec lesquelles 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 la façon dont est modèle / intégré une bibliothèque C ++.)
Prendre le premier fichier C dans un projet sur lequel je travaille, ce qui arrive si vous venez échange 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 des 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 de coût logiciel
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 à la question de recherche d'une implémentation de bibliothèque d'une file d'attente en C est dafter 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 approprié de C (y compris C99), et les bibliothèques Java et CPython peuvent être appelées directement à partir de C sans avoir à porter du code non lié au 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.