Ciò è richiesto da una risposta che ho dato a una domanda corrente che chiede di una libreria generics per C - l'interrogante afferma specificamente che non vogliono usare C ++.
C è un linguaggio di programmazione completo. C non è un sottoinsieme arbitrario di C ++. C non è affatto un sottoinsieme di C ++.
Questo è valido C:
foo_t* foo = malloc ( sizeof(foo_t) );
Per farlo compilare come C ++ devi scrivere:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
che non è più valido C. (potresti usare il cast in stile C, nel qual caso si compilerebbe in C, ma verrebbe evitato dalla maggior parte degli standard di codifica C ++ e anche da molti programmatori C; guarda i commenti "non lanciare malloc" in tutto Stack Overflow) .
Non sono la stessa lingua e se hai un progetto esistente in C non vuoi riscriverlo in una lingua diversa solo per usare una libreria. Preferiresti usare le librerie con cui puoi interfacciarti nella lingua in cui stai lavorando (in alcuni casi questo è possibile con alcune extern "C"funzioni wrapper, a seconda di come è template / inline una libreria C ++).
Prendendo il primo file C in un progetto su cui sto lavorando, questo è ciò che accade se effettui lo scambio gcc std=c99con 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
In totale 69 righe di errore, quattro delle quali sono conversioni non valide, ma principalmente per funzionalità che esistono in C99 ma non in C ++.
Non è che sto usando queste funzionalità per il gusto di farlo. Ci vorrebbe un lavoro significativo per portarlo in una lingua diversa.
Quindi è assolutamente sbagliato suggerirlo
[a] Il compilatore C è quasi certamente un compilatore C ++, quindi non ci sono implicazioni sui costi del software
Ci sono spesso significative implicazioni di costo nel portare il codice C esistente al sottoinsieme procedurale di C ++.
Quindi suggerire 'usa la classe C ++ std :: queue' come risposta alla domanda che cerca un'implementazione della libreria di una coda in C è dafter che suggerire 'usa l'obiettivo C' e 'chiama la classe Java java.util.Queue usando JNI' o 'chiama la libreria CPython' - Objective C è effettivamente un superset appropriato di C (incluso C99), e le librerie Java e CPython sono entrambe richiamabili direttamente da C senza dover trasferire codice non correlato al linguaggio C ++.
Ovviamente potresti fornire una facciata C alla libreria C ++, ma una volta che lo fai, C ++ non è diverso da Java o Python.