Isso é solicitado por uma resposta que dei a uma pergunta atual que pergunta sobre uma biblioteca de genéricos para C - o questionador afirma especificamente que não deseja usar C ++.
C é uma linguagem de programação completa. C não é um subconjunto arbitrário de C ++. C não é um subconjunto de C ++.
Este é C válido:
foo_t* foo = malloc ( sizeof(foo_t) );
Para fazer a compilação como C ++, você deve escrever:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
que não é mais válido C. (você poderia usar o elenco de estilo C, caso em que seria compilado em C, mas seria evitado pela maioria dos padrões de codificação C ++ e também por muitos programadores C; testemunhe os comentários "não elenco malloc" em todo o Stack Overflow) .
Eles não são a mesma linguagem e, se você tiver um projeto existente em C, não deseja reescrevê-lo em uma linguagem diferente apenas para usar uma biblioteca. Você prefere usar bibliotecas com as quais possa interagir na linguagem em que está trabalhando. (Em alguns casos, isso é possível com algumas extern "C"
funções de invólucro, dependendo de como é o modelo / inline uma biblioteca C ++.)
Pegando o primeiro arquivo C em um projeto no qual estou trabalhando, isso é o que acontece se você apenas trocar gcc std=c99
por 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
No total, 69 linhas de erros, quatro dos quais são conversões inválidas, mas principalmente para recursos que existem no C99, mas não no C ++.
Não é como se eu estivesse usando esses recursos para me divertir. Seria um trabalho significativo transferi-lo para um idioma diferente.
Portanto, é totalmente errado sugerir que
[a] O compilador C quase certamente é um compilador C ++, portanto, não há implicações de custo de software
Freqüentemente, há implicações de custo significativas na portabilidade do código C existente para o subconjunto procedimental do C ++.
Portanto, sugerir 'usar a classe C ++ std :: queue' como uma resposta à pergunta em busca de uma implementação de biblioteca de uma fila em C é mais rápido do que sugerir 'usar C objetivo' e 'chamar a classe Java java.util.Queue usando JNI' ou 'chamar a biblioteca CPython' - Objective C realmente é um superconjunto apropriado de C (incluindo C99), e as bibliotecas Java e CPython podem ser chamadas diretamente de C sem ter que portar código não relacionado para a linguagem C ++.
Claro que você pode fornecer uma fachada C para a biblioteca C ++, mas uma vez que você está fazendo isso, C ++ não é diferente de Java ou Python.