Esto se debe a una respuesta que di a una pregunta actual que indaga sobre una biblioteca genérica para C; el interrogador afirma específicamente que no quiere usar C ++.
C es un lenguaje de programación completo. C no es un subconjunto arbitrario de C ++. C no es un subconjunto de C ++ en absoluto.
Esto es válido C:
foo_t* foo = malloc ( sizeof(foo_t) );
Para que se compile como C ++ tienes que escribir:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
que ya no es válida C. (podría usar la conversión de estilo C, en cuyo caso se compilaría en C, pero sería rechazado por la mayoría de los estándares de codificación de C ++, y también por muchos programadores de C; observe los comentarios de "no lanzar malloc" en todo Stack Overflow) .
No son el mismo idioma, y si tiene un proyecto existente en C, no desea reescribirlo en un idioma diferente solo para usar una biblioteca. Preferiría utilizar bibliotecas con las que pueda interactuar en el idioma en el que está trabajando. (En algunos casos, esto es posible con unos pocosextern "C" funciones contenedoras, dependiendo de la plantilla / en línea de una biblioteca C ++).
Tomando el primer archivo C en un proyecto en el que estoy trabajando, esto es lo que sucede si simplemente cambia gcc std=c99por 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
En total 69 líneas de errores, cuatro de las cuales son conversiones no válidas, pero principalmente para características que existen en C99 pero no en C ++.
No es como si estuviera usando esas funciones por el gusto de hacerlo. Se necesitaría un trabajo significativo para portarlo a un idioma diferente.
Por tanto, es un error sugerir que
[a] El compilador de C es casi seguro que en realidad es un compilador de C ++, por lo que no hay implicaciones de costos de software
A menudo, hay implicaciones de costos significativas al migrar el código C existente al subconjunto de procedimientos de C ++.
Entonces, sugerir 'usar la clase C ++ std :: queue' como respuesta a la pregunta de buscar una implementación de biblioteca de una cola en C es más posterior que sugerir 'usar el objetivo C' y 'llamar a la clase Java java.util.Queue usando JNI' o 'llamar a la biblioteca CPython' : Objective C en realidad es un superconjunto adecuado de C (incluido C99), y las bibliotecas Java y CPython se pueden llamar directamente desde C sin tener que transferir código no relacionado al lenguaje C ++.
Por supuesto, podría proporcionar una fachada C a la biblioteca C ++, pero una vez que lo esté haciendo, C ++ no es diferente a Java o Python.