Quando usar C sobre C ++ e C ++ sobre C?

164

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

Dark Templar
fonte
4
O uso de C in-line no código C ++ é geralmente para determinados módulos que precisam ser altamente otimizados, executam trabalhos de baixo nível mais próximos do hardware ou são críticos para a integridade dos dados ou até para a segurança humana e precisam ser auditáveis ​​e comprovadamente corretos. Em vez de fazer tudo em C, a maior parte do projeto pode tirar proveito dos recursos do C ++ para projetos flexíveis, enquanto obtém os benefícios da rigidez do C nos locais onde é necessário.
Kllben #
30
@kylben: Muitos caras do C ++ dirão a você: (1) O desempenho não é uma razão para cair no C (talvez para evitar virtuale alguns outros recursos que impedem otimizações, mas, por exemplo, as não virtualclasses 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, qsortvs std::sort). (2) A alta importância da correção é um motivo para usar C ++ (segurança tipográfica, constsegurança, privateRAII para tornar o gerenciamento de recursos gerenciável etc.) sobre C. Ou, nesse caso, use Ada ou algo assim.
11
@ Pubby8 Não concordo com isso. Se estou trabalhando em um arquivo .c e vejo pessoas fazendo isso, costumo sinalizá-las mentalmente como não sabendo o que estão fazendo. Por exemplo, não há necessidade de lançar a partir void*para outro tipo de ponteiro em código C, é muito perturbador e típico de pessoas que não sabem C.
asveikau
4
@kylben: (Você pode aprender a abordar outras pessoas adequadamente em suas respostas aos comentários, para que elas possam realmente vê- las.) Que "um programador muito familiarizado com o modo como o compilador transforma C em asm" funcionaria para C ++ da mesma forma que bem. Mas isso é simplesmente irrelevante: se você quiser se envolver com asm, basta escrever asm em vez de um compilador criá-lo a partir de outra linguagem. A maneira como isso acontece pode mudar a cada atualização do compilador, afinal.
SBI
9
Na minha humilde opinião ... você usa C quando quiser, para mim: C é muito mais simples e fácil de usar que C ++ ... C ++ pode parecer um "C com classes", mas não é mais, agora é uma linguagem muito complexa, com coisas como Construtores Virtuais e Modelos.
Disoco

Respostas:

184

Você escolhe C quando

  • você precisa de um assembler portátil (que é realmente o C) por qualquer motivo,
  • sua plataforma não fornece C ++ (um compilador C é muito mais fácil de implementar),
  • você precisa interagir com outros idiomas que só podem interagir com C (geralmente o menor denominador comum em qualquer plataforma) e seu código consiste em pouco mais que a interface, não valendo a pena colocar uma interface C em código C ++,
  • você invade um projeto de código-fonte aberto (muitos dos quais, por várias razões , seguem C),
  • você não conhece C ++.

Em todos os outros casos, você deve escolher C ++.

sbi
fonte
15
Eu também acrescentaria que o C ++ com modelo de exceção às vezes traz mais problemas do que vale a pena, por exemplo, kernels do sistema operacional. Pelo menos esse é o sentimento geral que tive ao ler sobre coisas.
Coder
12
@SF: C é a língua franca? Essa é nova. Ou melhor, muito velho. Talvez se você apenas conversar com pessoas que não aprenderam novos idiomas nos últimos 20 anos, mas eu diria que o conhecimento em C não é mais muito comum.
DeadMG
13
@SF .: Como já escrevi em outros lugares, participei de projetos que totalizaram milhões de LoC e vi muito poucas meta-coisas em comparação com projetos C com seu inevitável e onipresente hackeamento de macro. (OTOH, a capacidade de criar EDSLs quando necessário pode ser uma ferramenta incrivelmente poderosa em sua caixa.) Quanto a C ser a língua franca: prefiro manter meu termo de que é o menor denominador comum. E eu não gostaria que pessoas com habilidades de programação moderadas invadissem um kernel do sistema operacional.
SBI
18
@ Max: eu discordo completamente. C é uma linguagem inútil, a menos que alguma barreira prática intransponível impeça o uso de C ++.
111311 DeadMG
17
@ Botões: Foi você quem fez uma reclamação ("C ++ precisa de mais memória"), então deveria ser você quem faz o backup. E não, não estou afirmando que o C ++ precise de menos memória. O que estou dizendo é que os recursos custam, não importa se o compilador os implementa para você (funções virtuais) ou se você os executa (matriz de ponteiros de função).
SBI
88

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 ..."

Jerry Coffin
fonte
12
O suporte da ferramenta não é um arenque vermelho. Concedido, hoje em dia temos clang. Mas o apoio ferramenta para C ++ faz lag por trás oder línguas consideravelmente, mesmo nos IDEs peixe graúdo. Por que é que? Simples, porque até muito recentemente não havia clang (e o GCC nunca era uma alternativa). Até talvez meio ano atrás, se você precisava de um código AST de C ++, estava basicamente sem sorte ou fora de milhares de dólares (se você comprou o frontend da EDG).
Konrad Rudolph
5
+1 e, para que conste, escrevo regularmente código C ++ para processadores de 8 bits com ROMs 4KiB.
avakar
2
+1 para obter uma ótima resposta geral. O que eu não entendo (não tenho experiência em escrever isso) é por que (acho que estamos falando de incorporados?) Um compilador C deve produzir um código executável menor que um compilador C ++, devido ao mesmo conjunto de recursos usado ? Talvez você possa fornecer algumas referências?
Martin Ba
2
@ Martin: o principal é que o C ++ inclui tratamento de exceções, o que (pelo menos geralmente) adiciona um mínimo ao tamanho do executável. A maioria dos compiladores permitirá que você desabilite o tratamento de exceções, mas quando você faz o resultado não é mais C ++. Eu suspeito que também há um pouco do simples fato de que muitos fornecedores de compiladores C ++ simplesmente não trabalham tão duro na produção do menor código de saída possível.
Jerry Coffin
3
"Descobrimos que usar C ++ em vez de C resulta em melhor qualidade de software e menor esforço de manutenção ..." essa é a conclusão a ser lembrada.
Stephane Rolland
24

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.)

Casey Patton
fonte
51
-1pelo discurso de Linus. : - {
sbi 10/10
12
Não me menos um por isso! Haha Não concordo com Linus, mas é um bom exemplo de POR QUE as pessoas podem escolher C em vez de C ++ (se acreditam no que Linus acredita). Não estou comentando a legitimidade dessas razões.
Casey Patton
10
@CaseyPatton: Basicamente, eu voto negativo todas as respostas que apresentam esse discurso retórico descomentado, como se fosse um argumento real.
SBI
11
@ Codificador: Você não precisa conhecer a implementação do STL. O ponto principal da STL é que você não precisa conhecer a implementação, a menos que esteja contando com um comportamento não definido pela Norma; nesse caso, por que se preocupar em usar a biblioteca Padrão? Além disso, é mais do que um pouco insano não gostar de uma linguagem por causa de como os desenvolvedores se comportam. Programadores de C se comportam como C é um presente de Deus para o Homem e são cegos demais para ver a verdade óbvia de que C ++ oferece recursos que são fundamental e intrinsecamente diretamente superiores a C, como RAII.
DeadMG
8
@ Codificador: Se você acabar com tantos shared_ptrs em um único objeto que você excede o contador interno, está fazendo errado. O Padrão especificará um tamanho mínimo para o contador - provavelmente 32 bits - e é bastante irreal ter que ter mais de 2 bilhões de compartilhamentos_ptrs em um único objeto. Mesmo se o objeto em si tivesse tamanho 0 e você tivesse um alocador de memória de sobrecarga zero, ainda estará consumindo 16 GB de memória, apenas em shared_ptrs.
131311 DeadMG
13

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.

DeadMG
fonte
11
Seguindo seu raciocínio, não há sentido algum na pergunta original e, portanto, deve ser encerrada. Eu acho que a pergunta deve ser lida da seguinte maneira: quando devemos nos restringir ao subconjunto C do C ++ (use C simples) e quando faz sentido usar o C ++ completo.
Giorgio
Isso é verdade, mas apenas para casos de uma pessoa trabalhando em seu próprio projeto. Na vida real, quase todo mundo gasta talvez metade do tempo trabalhando no código de outras pessoas. Infelizmente, a maioria das outras pessoas "pensa errado" em relação a essas razões totalmente irracionais.
darenw
11
@DeadMG: Como os alocadores devem relatar erros sem gerar exceções? Além disso, adicionar mais recursos não é necessariamente melhor quando tudo o que faz é adicionar complexidade ou redundância.
Mankarse
@Mankarse: Se você compilar com as opções para desativar as exceções, os alocadores abortam o programa ou continuam usando um ponteiro nulo, dependendo da implementação da biblioteca.
Zan Lynx
4
@Mankarse: Desde a minha experiência em 2007, quando tentei rodar um sistema Linux com 1 GB de RAM e sem troca, quase todo software de desktop falha de maneira horrível quando a alocação de memória falha de qualquer maneira.
precisa saber é o seguinte
9

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 classe Foo(e de qualquer classe de que dependa) foi definido. É também por isso que a convenção é escrever em ++itvez de it++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 ++:

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

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 stringtipo 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 getsfunção agora desativada ou através scanfdos especificadores %se 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 malloce free, 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 ++

John Bode
fonte
2
O gerenciamento de memória é complexo e propenso a erros em alguns casos, mas especialmente no mundo incorporado, geralmente é prático escrever programas em C usando alocação de memória totalmente estática. Se o programa vincular, ele não poderá ficar sem memória em tempo de execução. Essas garantias podem ser facilmente alcançadas em C ++?
Supercat
9

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.

stackoverflowuser2010
fonte
19
Sua frase final não é um motivo para usar C. Você pode chamar as bibliotecas C em C ++.
usar o seguinte comando
2
Eu costumava c ++ para um projeto de DSP - não c
BЈовић
9

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.

Coder
fonte
12
E de que maneira exatamente o gerenciamento manual de memória é "mais estável" do que as abstrações do C ++ como std::stringessas? Você já tentou especificar uma plataforma em que shared_ptro 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.
SBI
12
@Lundin: '"Tem que ser 1000% estável" implementações não permitem alocação dinâmica de memória em primeiro lugar'. E o que impede você de fazer exatamente isso em C ++? (E fazer declarações gerais sobre o meu conhecimento e experiência em vez de fornecer quaisquer argumentos é um truque retórica em vez barato.)
SBI
10
@Lundin: É bom que você tenha começado a fornecer argumentos, em vez de retórica. Mas eles são fracos. O fato de você ter "esquecido" um dos principais recursos do C ++ (modelos), que torna o código mais seguro (porque permite a execução de algoritmos - e, portanto, falha - no tempo de compilação , eliminando erros de tempo de execução) fale a favor do seu conhecimento da língua que você está julgando. A redução de C ++ para uma linguagem OO foi criticada antes aqui e por boas razões. (Além disso, classes com destruição determinista são uma grande ferramenta e útil para o gerenciamento de outros recursos do que apenas a memória.)
SBI
9
@Lundin Claro que você não gostaria de usar std::stringse não quiser alocação dinâmica. Você usaria std::basic_string<char, std::char_traits<char>, some_allocator_here>.
Luc Danton
10
@ Codificador: O que você acha que prova com isso? O primeiro é simplesmente um código incorreto (e seria tão ruim quanto relatar erros que os valores retornados), o segundo defende o RAII sobre a limpeza manual, na qual todo desenvolvedor C ++ meio decente torceria e Joel, tanto quanto eu respeitá-lo, disse algumas coisas que eu discordo totalmente. Sua ficha para uma única entrada e uma única saída cheira mal a um peido velho desinformado que nunca concorda que o que aprendeu há 25 anos foi superado. (Veja bem, eu estava programando 25 anos atrás, quando SESE foi o estado da arte.)
SBI
6

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:

  • não use mais memória do que deseja
  • não acesse as páginas de memória de maneira desagradável (a tabela pode estar em qualquer lugar)
  • não invoque muito código acidentalmente

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)

Macke
fonte
11
Há muitas coisas que C não oferece controle. Tente escrever um código portátil eficiente para multiplicar um uint32_t por um uint32_t para gerar um resultado uint32_t (32 bits inferiores do produto). Se um inttiver 64 bits, é necessário converter pelo menos um operando para uint64_tevitar 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".
Supercat
Não é. O compilador faz coisas como alocações de registro para você. Não consigo escrever código sustentável em assembly, no CI pode.
Nils
2

(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.

anon
fonte
1

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.

Jonathan
fonte
0

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.

johannes
fonte
0

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.

Basile Starynkevitch
fonte