Fui apresentado à Ciência da Computação há pouco mais de um ano e, pela minha experiência, parece que C e C ++ são considerados linguagens "ultra-rápidas", enquanto outros, como Python e essas linguagens de script, geralmente são consideradas um pouco mais lentas .
Mas também vi muitos casos em que um projeto de software ou mesmo um pequeno intercalava arquivos onde um certo número n desses arquivos seria gravado em C e um certo número m desses arquivos seria gravado em C ++.
(Também notei que os arquivos C ++ quase sempre têm cabeçalhos correspondentes, enquanto os arquivos C nem tanto). Mas meu principal ponto de investigação é obter uma noção geral da intuição sobre quando é apropriado usar C sobre C ++ e quando é melhor usar C ++ sobre C. Além dos fatos que (1) C ++ é orientado a objetos, C não é e (2) as sintaxes são muito semelhantes, e o C ++ foi intencionalmente criado para se assemelhar a C de várias maneiras. Não tenho certeza de quais são suas diferenças. Parece-me que eles são (quase) perfeitamente intercambiáveis em muitos domínios.
Portanto, seria apreciado se alguém pudesse esclarecer a situação! obrigado
virtual
e alguns outros recursos que impedem otimizações, mas, por exemplo, as nãovirtual
classes não são inerentemente ineficientes, e os modelos são um poderosa ferramenta de abstração que pode realmente levar a mais eficiência - por exemplo,qsort
vsstd::sort
). (2) A alta importância da correção é um motivo para usar C ++ (segurança tipográfica,const
segurança,private
RAII para tornar o gerenciamento de recursos gerenciável etc.) sobre C. Ou, nesse caso, use Ada ou algo assim.void*
para outro tipo de ponteiro em código C, é muito perturbador e típico de pessoas que não sabem C.Respostas:
Você escolhe C quando
Em todos os outros casos, você deve escolher C ++.
fonte
Existem algumas razões para preferir C. A principal é que tende a ser mais difícil produzir executáveis realmente minúsculos com C ++. Para sistemas realmente pequenos, você raramente escreve muito código, e o espaço ROM adicional que seria necessário para C ++ em vez de C pode ser significativo.
Devo acrescentar, no entanto, que, para sistemas realmente minúsculos, C tem problemas exatamente pelo mesmo motivo, e a linguagem assembly é quase a única opção razoável. A variedade de tamanhos de sistema dentro dos quais C realmente faz sentido é bastante pequena e diminui constantemente (embora eu admita, bem devagar).
Outro momento / razão para usar C é fornecer um conjunto de funções às quais você pode se ligar essencialmente de qualquer outro idioma. Você pode escrever essas funções em C ++, definindo-as como
extern "C"
funções, mas isso as restringe a apresentar uma "face" essencialmente C-life para o mundo - classes, funções sobrecarregadas, modelos e funções-membro etc. Aplique. Porém, isso não restringe necessariamente o desenvolvimento ao C - é perfeitamente razoável usar todo e qualquer tipo de recursos do C ++ internamente , desde que a interface externa pareça com o C.Ao mesmo tempo, devo dizer que as respostas de @ Toll (por um exemplo óbvio) têm coisas quase inversas na maioria dos aspectos. C ++ razoavelmente escrito geralmente será pelo menos tão rápido quanto C e, geralmente, pelo menos um pouco mais rápido. A legibilidade geralmente é muito melhor, apenas porque você não fica enterrado em uma avalanche de todo o código, mesmo para os algoritmos e estruturas de dados mais triviais, para todo o tratamento de erros, etc.
Os modelos não "corrigem um problema com o sistema de tipos da linguagem", eles simplesmente adicionam vários recursos fundamentais quase completamente ausentes de C e / ou C ++ sem modelos. Uma das intenções originais era fornecer recipientes com segurança de tipo, mas, na realidade, eles vão muito além disso - essencialmente, nenhum dos quais C fornece.
As ferramentas automatizadas também são principalmente um arenque vermelho - embora seja verdade que escrever um analisador C seja menos trabalhoso do que escrever um analisador C ++, a realidade é que, no final, não faz praticamente nenhuma diferença. Muito poucas pessoas estão dispostas ou são capazes de escrever um analisador utilizável para qualquer um deles. Como tal, o ponto de partida razoável é Clang de qualquer maneira.
Por acaso, C e C ++ são frequentemente usados juntos nos mesmos projetos, mantidos pelas mesmas pessoas. Isso permite algo que de outra forma é bastante raro: um estudo que compare objetiva e diretamente a capacidade de manutenção do código escrito nos dois idiomas por pessoas igualmente competentes em geral (ou seja, exatamente as mesmas pessoas). Pelo menos no estudo vinculado, uma conclusão foi clara e inequívoca: "Descobrimos que usar C ++ em vez de C resulta em melhor qualidade de software e menor esforço de manutenção ..."
fonte
As diferenças entre C e C ++ já foram enumeradas em detalhes aqui . Embora às vezes as pessoas possam ter razões legítimas para escolher uma ou outra (C ++ para OOP ou C quando sentem que os recursos extras do C ++ introduzem sobrecarga indesejável, por exemplo), na minha experiência, geralmente se resume a preferência. O que as pessoas que trabalham neste arquivo conhecem melhor e mais gostam? Acredito que esse seja o motivo na maioria das vezes, pois é verdade que esses idiomas lidam com aplicativos críticos de desempenho.
(Observação: confira o discurso de Linus Torvads sobre por que ele prefere C a C ++. Não concordo necessariamente com os pontos dele, mas fornece informações sobre por que as pessoas podem escolher C em C ++. Em vez disso, pessoas que concordam com ele pode escolher C por esses motivos.)
fonte
-1
pelo discurso de Linus. : - {O principal problema que falta nas respostas existentes (no momento da publicação) é a escolha.
É simples. Se, por alguma razão totalmente irracional, você achar que as exceções não valem a pena, então você não precisará usá-las . Você ainda pode ter modelos, RAII e a biblioteca Standard e nunca escrever um único "lance". O mesmo vale para os modelos. Se, por algum motivo, você achar que eles causam inchaço executável irrevogável (e realmente importante, que é apenas incorporado), então surpreenda - você pode usar void * e sizeof (T) o dia todo também. Nada obriga a usar qualquer um dos recursos do C ++ em C.
É por isso que o C ++ é uma linguagem inerentemente superior - você pode escolher os recursos que deseja e voltar à programação no estilo C quando não gostar de um determinado recurso. Portanto, dado que C ++ é tudo o que C é e mais, é um fato óbvio que C ++ é uma linguagem superior. Sugerir o contrário é como tentar sugerir que 4 é maior que 5.
fonte
Coisas sobre C ++ que deixam os programadores em C nervosos
Há muita mágica acontecendo sob o capô; construtores, destruidores, métodos virtuais, modelos etc. podem tornar o código C ++ muito mais fácil e rápido de escrever do que o código C equivalente, mas mais difícil de entender e raciocinar (dependendo de quão bem você conhece C ++ e suas convenções associadas). Algo tão simples quanto
Foo newFoo;
invocar muito código, dependendo de como o construtor da classeFoo
(e de qualquer classe de que dependa) foi definido. É também por isso que a convenção é escrever em++it
vez deit++
iterar em um contêiner, pois o postfix++
geralmente envolve uma operação de cópia cara.Dependendo do que você está fazendo, pode haver uma sobrecarga não trivial, especialmente para tarefas simples. Tome os dois programas a seguir, o primeiro em C, o segundo em C ++:
Comportamento idêntico, não muita diferença em termos de origem, mas na caixa SLES 10 em que trabalho com o gcc 4.1.2, o primeiro gera um executável de ~ 9kb de tamanho, enquanto o segundo ocupa 12,5kb (sem otimização ), quase 28% maior. O
string
tipo C ++ é muito mais fácil de trabalhar com IMO do que a biblioteca de cadeias C, e os fluxos C ++ são muito mais flexíveis e personalizáveis que os fluxos C, mas, para códigos realmente inoperantes como esse, eles podem não valer a pena.C ++ é uma linguagem enorme em comparação com C, com algumas semânticas extremamente complexas. Demora muito mais tempo para obter proficiência em C ++ do que em C, o que significa que muitas pessoas que afirmam conhecer C ++ não o conhecem tão bem quanto pensam.
Coisas sobre C que deixam os programadores em C ++ nervosos
C não é uma linguagem de programação segura por qualquer extensão da imaginação; nenhuma verificação de limites em matrizes leva a muitos comportamentos exploráveis (seja através da
gets
função agora desativada ou atravésscanf
dos especificadores%s
e de%[
conversão). C ++ pelo menos fornece contêineres que lançam exceções se você tentar acessar fora do intervalo definido atualmente; tudo o que C fornece é (se você tiver sorte) uma violação de segmentação.O gerenciamento de memória em C é muito trabalhoso e propenso a erros, em comparação com as ferramentas que o C ++ fornece. Se você estiver construindo seu próprio contêiner, será responsável por fazer a correspondência de todas as chamadas
malloc
efree
, garantir que as alocações sejam bem-sucedidas, fazer backup de alocações parciais em caso de erro, etc. No C ++, você apenas adiciona itens a ou remova itens do contêiner. Se houver algum problema, uma exceção será lançada.Da mesma forma, o tratamento de erros em C é um problema, comparado às ferramentas que o C ++ fornece (ou seja, exceções). O que é realmente divertido é quando você aloca um monte de memória e bate em uma parede no seu processamento; como você precisa se afastar, precisa liberar essa memória na ordem certa. Com os princípios C ++ e RAII, isso é (relativamente) fácil de fazer.
Então, quando uso um sobre o outro?
Se o que você está escrevendo é um pântano simples, leia-o / elimine-o / elimine-o, cujo comportamento pode ser descrito de maneira limpa em termos de entradas e saídas e questões de desempenho, em seguida, prefira C sobre C ++. Caso contrário, prefira C ++
fonte
Bjarne Stroustrup mantém uma lista de aplicativos e empresas que usam C ++; você pode argumentar sobre programação procedural versus programação OOP o quanto quiser, mas não pode argumentar com os resultados do setor nos últimos 20 anos.
O C ++ é comumente usado para projetos complexos em grande escala, com vários homens, onde pessoas separadas precisam trabalhar em componentes modularizados. Você pode criar e manter código modularizado em C, é claro, mas a natureza OOP inerente do C ++ leva a modularização, testabilidade e reutilização de código superiores.
A biblioteca padrão C ++ (STL), por si só com apenas vetores e mapas, é motivo suficiente para usar C ++.
C é comumente usado para sistemas embarcados.
Eu pessoalmente usaria C apenas se houver alguma biblioteca que tenha apenas uma API C.
fonte
Eu diria que a principal razão pela qual eu escolheria C em vez de C ++ é apenas quando eu teria que recorrer ao tipo de coisa "NASA isto tem que ser 1000% estável" da NASA.
C ++ é ~ 99% C quando olhamos para o desempenho e é muito mais produtivo. Assim, mesmo em C, você pode escrever um código que será mais rápido que o C ++ (você pode usar um subconjunto de C ++ sem exceções, virtual, streaming, abstrações etc. também, mas isso é basicamente C), a hora de otimizar tudo enquanto o STL é testado e já faz isso, custaria mais do que o pequeno ganho de desempenho que você pode alcançar ou sacrificar porque os algoritmos STL foram escritos por grupos de especialistas e você provavelmente não é especialista em tudo.
Por outro lado, o C ++ possui uma tonelada de abstrações. Quando sob circunstância eles vazam, isso cria problemas. E há poucas pessoas que conhecem 100% das dicas de C ++, enquanto, eu acho, há mais que conhecem todas as dicas de C; portanto, escrever uma solução em que cada etapa seja totalmente compreendida por todos os membros de uma equipe é muito mais fácil em C.
Exemplo: você sabe quando
shared_ptr<smthn>
irá exceder sua contagem de referência, isso lançará uma exceção? Coisas como essas não são legais quando o Shuttle precisa voltar à atmosfera, pelo menos acho que sim.Além disso, o tratamento de exceções é muito, muito difícil, comparado aos códigos de erro. É difícil ver se a classe é 100% segura contra exceções e fácil de entrar em vazamentos. Muitas pessoas de alta reputação expressaram essa opinião.
fonte
std::string
essas? Você já tentou especificar uma plataforma em queshared_ptr
o contador transbordaria? Seria uma plataforma engraçada. E se você acha que o tratamento de exceções é difícil, deve examinar um pedaço de código C que verifica todos os erros possíveis em todas as chamadas de função. (Admito que esse código seja difícil de encontrar, mas esse é apenas um argumento ainda mais forte contra a sua afirmação.) Desculpe, mas são excrementos genuinamente bovinos.std::string
se não quiser alocação dinâmica. Você usariastd::basic_string<char, std::char_traits<char>, some_allocator_here>
.C é uma montagem portátil com melhor sintaxe, fornecendo ao programador controle total de tudo .
O C ++, por outro lado, faz muita mágica divertida (funções virtuais, sobrecarga, conversão automática etc.) que pode não ser desejável quando você deseja ter certeza de que:
E quer algo realmente simples de trabalhar, já que você está focado no desempenho.
Simplesmente não tem surpresas, e isso é muito valioso.
Se você quiser (e eu o recomendo), leia as diretrizes de codificação JSF sobre o que você precisa pensar ao escrever C ++ para controle de aviônicos militares. São muitas as armadilhas que você precisa conhecer, e isso pode te pegar. Bjarne fazia parte desse documento, então ele sabe do que se trata.
Além disso, C compila como um troll escaldado atingido por um raio. O C ++, OTOH, provavelmente foi patrocinado pelas mesmas pessoas que investiram em empresas de SSD. :)
(Pessoalmente, prefiro C ++, mas também não gosto ....... ;-P)
fonte
int
tiver 64 bits, é necessário converter pelo menos um operando parauint64_t
evitar o comportamento indefinido, mas ter que converter para 64 bits com o objetivo de calcular um resultado de 32 bits é - para dizer o mínimo - "surpreendente".(desde que você tenha igual familiaridade com os dois idiomas)
Vá com C ++, a menos que não exista um compilador C ++ para sua plataforma. Você pode escrever código C ++ sem a parte da linguagem que você não gosta (sem classes, exceções, herança virtual, quaisquer restrições pessoais que você deseja aplicar) e, em algum momento no futuro, se você desejar afinal, esses recursos, você pode usá-los facilmente. Nada no C ++ impede você de escrever código no estilo C.
(com conjuntos de ferramentas equivalentes e conhecimento do desenvolvedor) Não há razão para escolher C em C ++, desde que sua plataforma tenha um compilador C ++. Você pode simplesmente se limitar ao subconjunto do idioma que deseja hoje, deixando a porta aberta para extensão mais tarde.
fonte
Ambos os idiomas são excelentes. Eu acho que vários pôsteres detalharam os pontos fortes e os vários usos de cada um. Vou simplesmente adicionar isso:
Eu vejo a linguagem C perfeita em 4 áreas: 1) eu acho que é a melhor linguagem para usar quando aprendemos qualquer tipo de programação [combinada com alguma montagem e conhecimento de código de máquina], 2) é ótima para escrever drivers, 3) incorporada e 4) software do sistema no nível mais baixo.
C ++ é uma linguagem orientada a objetos, mas também pode ser processual (muito parecido com C). Se você estiver trabalhando em projetos de grande escala, software baseado em GUI, software de jogos e outros tipos de software com uso intenso de gráficos, acho que C ++, Java ou mesmo Objective-C é a melhor escolha. No entanto, há muitos programas de linha de comando ou software de sistema nos quais você pode achar que o C ++ é tão bom ou melhor que C.
fonte
Na minha opinião, há um ponto que falta nesta discussão: É mais simples em C fornecer uma interface binária estável a partir de uma biblioteca. Tanto para uso com outros idiomas quanto com C ++.
No C ++, diferentes compiladores usam nomes diferentes, para que os consumidores de uma biblioteca compilada com um compilador diferente da biblioteca possam ter problemas ao usá-lo. Com C, a interface binária, geralmente, é padronizada para a plataforma.
Eu sei que os compiladores hoje em dia geralmente têm opções para produzir coisas compatíveis com o gcc, mas isso nem sempre ajuda.
Observo isso no Solaris com relativa frequência. A distribuição e os diferentes fornecedores de software geralmente usam o Sun Studio porque, especialmente nos sistemas Sparc, geralmente fornece melhores resultados. Os projetos de código aberto do Man são escritos com código específico do gcc. Pode ser um pouco doloroso para aqueles que trabalham juntos.
fonte
C é provavelmente preferível a C ++ quando o código C é gerado (por exemplo, em implementações de linguagens de nível superior). Por exemplo, existem vários compiladores do tipo Lisp que emitem código C (por exemplo , Chicken , Scheme48 ...), mas não conheço nenhum que emita código C ++ genuíno (minha ferramenta MELT emite código C ++, mas não chamarei esse código de genuíno Código C ++, ele usa muito poucos recursos C ++).
O código C também é mais fácil de provar de forma semi-automática. Analisadores estáticos como Frama-C (em que você anota seu código C com comentários do ACSL para ajudar o provador a raciocinar sobre seu código) estão disponíveis para C, mas não tanto para C ++ 11 completo.
fonte