Por que alguém usaria C sobre C ++? [fechadas]

132

Embora as pessoas pareçam gostar de reclamar sobre C ++, não consegui encontrar muitas evidências de por que você desejaria escolher C em vez de C ++. C parece não receber tanta atenção e se C ++ tem todos esses problemas, por que você não pode se restringir apenas ao subconjunto C? Quais são seus pensamentos / experiências?

Simucal
fonte
exigir nenhuma ligação duplicada trabalhos mais longos ..... diz o cara que está atrasado para a festa c :)
kyle
4
C é realmente melhor e mais simples para C ++, mas qualquer programador de C pode converter C ++ em C e rir.
22415 BobRun
11
O mais assustador é que as pessoas em geral pensam que "++" significa que isso é realmente bom, desculpe, não é.
22415 BobRun
Além do óbvio - dispositivos pequenos / incorporados - geralmente C é melhor para problemas puros de processamento de números (por exemplo, processamento de gráficos de GPU, cálculos de física massivamente paralelos, mineração de padrões etc.), onde os recursos de OOP são inchados. O C ++ é melhor para sistemas de modelagem onde 'coisas' interagem, muito mais fácil com os recursos de OOP.
Paceman
3
Como o JavaScript, as práticas recomendadas, c ++ e OOP são estúpidas / muito ocupadas tentando resolver esses problemas abstratos que provavelmente não existem realmente ou precisam ser resolvidos.
Marshal craft

Respostas:

132

A resposta de Joel é boa por razões pelas quais você pode precisar usar C, embora existam outras:

  • Você deve atender às diretrizes do setor, que são mais fáceis de testar e testar em C.
  • Você tem ferramentas para trabalhar com C, mas não com C ++ (pense não apenas no compilador, mas em todas as ferramentas de suporte, cobertura, análise, etc.)
  • Seus desenvolvedores alvo são gurus C
  • Você está escrevendo drivers, kernels ou outro código de baixo nível
  • Você sabe que o compilador C ++ não é bom em otimizar o tipo de código que você precisa escrever
  • Seu aplicativo não apenas não se presta a ser orientado a objetos, mas também seria mais difícil de escrever dessa forma

Em alguns casos, porém, você pode querer usar C em vez de C ++:

  • Você deseja o desempenho do assembler sem o problema de codificar no assembler (o C ++ é, em teoria, capaz de um desempenho 'perfeito', mas os compiladores não são tão bons em ver otimizações que um bom programador de C verá)
  • O software que você está escrevendo é trivial, ou quase o mesmo - elimine o pequeno compilador C, escreva algumas linhas de código, compile e tudo pronto - não há necessidade de abrir um grande editor com auxiliares, não é necessário escrever praticamente classes vazias e inúteis, lidar com espaços para nome, etc. Você pode fazer quase a mesma coisa com um compilador C ++ e simplesmente usar o subconjunto C, mas o compilador C ++ é mais lento, mesmo para pequenos programas.
  • Você precisa de desempenho extremo ou tamanho pequeno de código e sabe que o compilador C ++ tornará mais difícil sua realização devido ao tamanho e desempenho das bibliotecas

Você afirma que poderia apenas usar o subconjunto C e compilar com um compilador C ++, mas descobrirá que, se fizer isso, obterá resultados ligeiramente diferentes, dependendo do compilador.

Independentemente disso, se você está fazendo isso, está usando C. A sua pergunta é realmente "Por que os programadores de C não usam compiladores de C ++?" Se for, você não entende as diferenças de idioma ou a teoria dos compiladores.

Adam Davis
fonte
2
Há também o padrão MISRA C, que o AFAIK ainda não é realmente estável para C ++.
Paul Nathan
60
A parte do desempenho não é necessariamente verdadeira. Existem muitas áreas em que o C ++ pode otimizar muito melhor que o C. (é claro que o inverso também é ocasionalmente verdadeiro, mas geralmente escolher C sobre C ++ por razões de desempenho é uma má ideia).
jalf
9
Eu estaria interessado em mais informações sobre desempenho. Não entendo por que C só teria um desempenho melhor "ocasionalmente". Dado um programador médio, pode ser que o C ++ facilite o desempenho (bom uso de padrões), mas um programa em C escrito por um especialista deve ser mais rápido - menor sobrecarga.
318 Adam Adam Davis
3
Obviamente, o programa C mais rápido levaria mais tempo para gravar e depurar, portanto há uma troca e, dada a velocidade das máquinas, a troca raramente vale a pena, exceto para aplicativos especializados, e é por isso que o C ++ geralmente é melhor. (no momento em que o código é feito, os computadores são mais rápidos e comer o dif)
Adam Davis
21
@ Adam: C ++ executa melhor que C com código "bonito". C ++ pode usar modelos e funções embutidas onde C precisa de uma macro. A sobrecarga do C ++ só aparece quando solicitada; caso contrário, é igual a C. (virtual, try / throw, dynamic_cast). Grande parte da sobrecarga é exibida apenas no tamanho da imagem do programa.
Zan Lynx
88

Eu gosto de minimalismo e simplicidade.

plan9assembler
fonte
9
OK - justo o suficiente ... então por que não adiante?
31416 Jonathan Leffler
14
Eu acho que ele também gosta de ter bibliotecas, livros, fóruns disponíveis?
gnud
30
Eu gosto do minimalismo e simplicidade de sua resposta ... :)
Joe DF
8
Aceita. C é muito simples e "pequeno". C sempre tem a mesma aparência e, se você é um novo colaborador de um projeto, é fácil entender como ele funciona. O c ++ tem algumas coisas inúteis e, ao olhar para um projeto em c ++, fico confuso instantaneamente. Eu posso entender as pessoas c ++ (uma linguagem C com recursos OO), mas C é apenas mais simples e fácil.
user69969
1
Também acho que C é uma linguagem muito mais adequada para escrever algum tipo de bibliotecas, como pequenas bibliotecas universais, linguagens de script e, sim, mecanismos de renderização.
keebus
65
  • Porque eles já sabem C
  • Porque eles estão criando um aplicativo incorporado para uma plataforma que possui apenas um compilador C
  • Porque eles estão mantendo software legado escrito em C
  • Você está escrevendo algo no nível de um sistema operacional, um mecanismo de banco de dados relacional ou um mecanismo de videogame 3D de varejo.
Joel Coehoorn
fonte
4
Alguns microcontroladores possuem apenas compiladores C, o que é realmente péssimo. Os recursos básicos do C ++ (namespaces, classes além de funções virtuais, enumerações, declarando variáveis ​​em outros lugares além do topo de bloco) são o IMHO mais valioso.
31700 Jason S
2
A partir disso, parece que você escolheria C somente se não houver alternativas razoáveis.
2
@ Joe: além do primeiro ponto, isso resume tudo. Muitas das línguas posteriores pegaram C e disseram: 'ei, podemos fazer melhor '.
Joel Coehoorn
1
Acordado. Se você não estiver usando os sofisticados recursos do C ++, acredito que o C ++ seja monotonicamente um C. melhor. Com os recursos mais sofisticados do C ++, as coisas ficam mais discutíveis, mas o debate geralmente é contra um nível mais alto de abstração - por exemplo, Java.
Paul Nathan
4
A maioria dos mecanismos de jogos 3D usa C ++, de fato. UE4 usa C ++, principalmente.
Aditya Kashi
56

Receios de desempenho ou inchaço não são boas razões para abandonar o C ++. Toda linguagem tem suas possíveis armadilhas e desvantagens - bons programadores aprendem sobre elas e, quando necessário, desenvolvem estratégias de enfrentamento, programadores ruins vão se calar e culpar a linguagem.

O Python interpretado é, em muitos aspectos, considerado uma linguagem "lenta", mas para tarefas não triviais, um programador especializado em Python pode facilmente produzir código que é executado mais rapidamente que o de um desenvolvedor C inexperiente.

No meu setor, videogames, escrevemos código de alto desempenho em C ++, evitando coisas como RTTI, exceções ou funções virtuais em loops internos. Eles podem ser extremamente úteis, mas têm problemas de desempenho ou inchaço que é desejável evitar. Se formos um passo adiante e mudarmos totalmente para C, ganharíamos pouco e perderíamos as construções mais úteis do C ++.

A maior razão prática para preferir C é que o suporte é mais amplo que o C ++. Existem muitas plataformas, especialmente as incorporadas, que nem sequer possuem compiladores C ++.

Há também a questão da compatibilidade para fornecedores. Enquanto C tem uma ABI estável e bem definida (Application Binary Interface), C ++ não. A ABI no C ++ é mais complicada devido a coisas como vtables e constructurs / destructors, por isso é implementada de maneira diferente com todos os fornecedores e até versões de uma cadeia de ferramentas de fornecedores.

Em termos reais, isso significa que você não pode pegar uma biblioteca gerada por um compilador e vinculá-la ao código ou a uma biblioteca de outra, o que cria um pesadelo para projetos distribuídos ou provedores de middleware de bibliotecas binárias.

Andrew Grant
fonte
7
"O Python interpretado é considerado, em muitos aspectos, uma linguagem" lenta ", mas para tarefas não triviais, um programador experiente do Python pode facilmente produzir código que é executado mais rapidamente que o de um desenvolvedor C inexperiente." Eu acho que um programador (não necessariamente um Python Progammer) que tomou aulas de algoritmos pode produzir código que é executado mais rapidamente que o de um desenvolvedor inexperiente (em geral).
Andrei Ciobanu 29/03
15
E esse mesmo c dev inexperiente produzirá código python mais lento que o código c. Python é muito mais lento que c.
Millie Smith,
37

Eu escolho escrever em C porque gosto de trabalhar com uma linguagem pequena e rígida. Eu gosto de ter acesso a um padrão que pode ser lido em um período de tempo razoável (para mim - sou um leitor muito lento). Além disso, eu o uso para escrever software para sistemas embarcados para os quais existem poucos compiladores C ++ desejáveis ​​(como alguns microcontroladores PIC).

anon
fonte
re: PICs - sinto sua dor. Se eu precisar fazer muito código PIC, provavelmente usarei o compilador IAR que suporta C ++. Eu usei no MSP430 e é muito bom.
31909 Jason S
1
E não se esqueça dos tempos de compilação amplamente aprimorados para C. Nenhum sistema de modelo.
Engenheiro de
35

Eu entendo a outra visão: por que usar C ++ em vez de C?

O livro The C Programming Language (aka: K&R) mostra claramente como fazer tudo o que a linguagem pode fazer em menos de 300 páginas. É uma obra-prima do minimalismo. Nenhum livro em C ++ chega perto.

O contra-argumento óbvio é que o mesmo poderia ser dito da maioria das linguagens modernas, se não de todas - elas também não podem dizer como fazer tudo em apenas algumas centenas de páginas. Verdade. Então, por que usar C ++? Riqueza de recursos? Poder? Se você precisar de algo mais rico ou poderoso em recursos, use C #, Objective C, Java ou algo assim. Por que se sobrecarregar com as complexidades do C ++? Se você precisa do grau de controle que C ++ concede, então eu argumento para usar C. C pode fazer qualquer coisa e pode fazê-lo bem.

Dinah
fonte
Concordo. Quero poder, então uso algo realmente poderoso, não o ponto intermediário.
Dinah
7
@Dinah: O waypoint de 1/2 oferece maior poder de expressão de nível, sem o desempenho e o custo de memória de C # ou Java.
Zan Lynx
5
@Zan Lynx: você está certo. Mas espero que, tomando a posição oposta que eu fiz no meu post original, tenha enfatizado a viabilidade do C sobre o C ++ ... mesmo que não seja, como você ressalta, um caso aberto e fechado.
Dinah
28

Além de vários outros pontos já mencionados:

Menos surpresa

isto é, é muito mais fácil ver o que um pedaço de código fará exatamente . No C ++, você precisa se aproximar do nível do guru para saber exatamente qual código o compilador gera (tente uma combinação de modelos, herança múltipla, construtores gerados automaticamente, funções virtuais e misture um pouco de mágica de namespace e pesquisa dependente de argumento).

Em muitos casos, essa mágica é boa, mas, por exemplo, em sistemas em tempo real, pode realmente estragar o seu dia.

jdisk
fonte
27

A resposta de Linus para sua pergunta é "Porque o C ++ é uma linguagem horrível"

Sua evidência é anedótica, na melhor das hipóteses, mas ele tem razão.

Sendo mais uma linguagem de baixo nível, você prefere o C ++. O C ++ é C com bibliotecas e suporte ao compilador adicionados para recursos extras (os dois idiomas têm recursos que o outro idioma não possui e implementam as coisas de maneira diferente ), mas se você tiver Com o tempo e a experiência com C, você pode se beneficiar de poderes adicionais de baixo nível relacionados adicionados ... [Editado] (porque você se acostuma a fazer mais trabalhos manualmente, em vez de se beneficiar de alguns poderes provenientes do próprio idioma / compilador)

Adicionando links:

Por que o C ++ para incorporado

Por que você ainda está usando C? PDF

Eu pesquisaria no google por isso .. porque já existem muitos comentários na web

Ric Tóquio
fonte
17
Eu fiz muita codificação em C, depois um breve período de tempo em C ++, depois um longo tempo embaraçoso com o VB, e agora eu tenho usado o C # nos últimos anos. Eu escrevi um pouco de código C e C ++ desde então e percebi que C é bem definido e rígido, C # é legal e poderoso, e C ++ é uma merda.
CMPalmer
25
Linus não está realmente qualificado para falar sobre os méritos do C ++. Citar ele como se ele fosse algum tipo de oráculo é simplesmente estúpido. E o pouco sobre "fazer as coisas da maneira mais difícil" não faz sentido. Existem boas razões para usar C, mas "é mais trabalho" ou "Linus disse que sim" não estão entre elas.
jalf
8
@ jalf, não citando Linus como se ele fosse algum tipo de oráculo, é bom mencionar a opinião de um programador conhecido por suas escolhas em um dos programas mais usados ​​no mundo: o kernel do linux. A pergunta pede opiniões (por que alguém escolheria C) é o que eu pretendia responder.
Ric Tokyo
6
Linus é uma fonte ruim de opiniões sobre C ++ porque ele não o usa e, tanto quanto eu sei, só tentou uma vez em 1990 - algo assim.
Zan Lynx
3
@Zan Linus exibiu mais autocontrole em outros lugares: "Gostaríamos de usar o C ++ e os recursos extras que ele traz, mas é mais difícil ver onde está o código incorreto no C ++ do que no C". A citação na minha resposta é um registro de uma opinião e não um "siga o líder".
Ric Tokyo
26

Porque eles estão escrevendo um plugin e o C ++ não possui ABI padrão.

Michel
fonte
9
Embora seja verdade, não é um motivo convincente para aderir ao C, porque você pode exportar as funções necessárias usando o vínculo C e ainda manter sua implementação em C ++.
codelogic 31/01/2009
2
@codelogic - projetos C ++ tendem a exportar muito mais tipos e funções do que os projetos C equivalentes. É possível ocultar isso em uma biblioteca compartilhada final, mas é possivelmente mais esforço do que vale a pena.
Tom
tbh não realmente uma boa resposta, mas uma, porque C ++ não tem ABI padrão (sim .. C ++ é uma porcaria)
Hasen
6
C também não possui ABI padrão.
Stephen Canon
25

Tempos de compilação longos podem ser irritantes. Com o C ++, você pode ter tempos de compilação muito longos (o que significa, é claro, mais tempo para o estouro de pilha!).

Frank
fonte
Por que isso foi rejeitado? Eu mesmo trabalho muito em C ++ e não voltaria ao C, mas ele pode realmente ter tempos de compilação dolorosamente longos (pense em modelos, por exemplo).
Frank
6
Uso C ++ para trabalho real, mas sempre protótipo em C devido aos tempos de compilação quase instantâneos.
Tom
Hmm, quando feito da maneira certa, ou seja, não ter inchado, podemos precisar desses # inclui e não temos certeza de qual é o direito de incluir, para que eu os inclua todos # inclui os tempos de compilação são legais. Quando eu corro em um ou três arquivos, levo apenas 1-2 segundos para compilar meus 100 projetos do KLOC.
Sebastian Mach
4
@ Tom: Gostaria de saber como é o seu verdadeiro trabalho em C ++, se você pode criar um protótipo em C. Você não está usando os recursos do C ++? Você pode elaborar?
Sebastian Mach
24

Estou acostumado a usar C ++ para meus projetos. Então, eu consegui um emprego em que C simples é usado (uma base de código em evolução de 20 anos de um software AV com documentação insuficiente ...).

As 3 coisas que eu gosto em C são:

  • Nada está implícito: você vê exatamente o que seu programa faz ou não. Isso facilita a depuração.

  • A falta de namespaces e sobrecargas pode ser uma vantagem: se você quiser saber onde uma determinada função é chamada, basta fazer uma grep no diretório de código-fonte e ele informará. Não são necessárias outras ferramentas especiais.

  • Redescobri o poder dos ponteiros de função. Basicamente, eles permitem que você faça todas as coisas polimórficas que você faz em C ++, mas são ainda mais flexíveis.

Calmarius
fonte
8
+1 No entanto, esse polimorfismo em C geralmente é obtido via void *, o que é perigoso, pois desabilita qualquer capacidade do compilador de verificar se você está fazendo algo desagradável.
Gd1
4
@ gd1 Na prática, não me lembro de nenhum caso em que isso tenha void*causado problemas. Existem muitas técnicas de programação defensiva para se proteger contra erros: colocar declarações em todos os lugares, adicionar números mágicos em suas estruturas (em compilações de depuração), etc. Mas hoje em dia temos valgrind, dr. memória e até o MSVC instrumentam o código para detectar problemas; portanto, é fácil resolver os problemas de corrupção de memória.
Calmarius
4
Quase nunca encontro corrupção de memória nos meus programas, mas, se possível, prefiro que erros sejam detectados antes de executar o programa. Fundição void*de whatever*é algo que o compilador aceita de boa fé. Prefiro que meu compilador não confie em mim e tenha a possibilidade de aplicar verificações de tipo robustas. Erros de substituição de modelo emitidos por compiladores C ++ são difíceis de ler, mas pelo menos o lixo não é compilado.
Gd1
1
@ gd1 De volta ao seu primeiro comentário, não sei quanta experiência você possui com técnicas processuais (vejo que você está ativo na maioria das tags OO). O void*geralmente pode ser evitado. O padrão típico ao adicionar comportamento personalizado é passar um ponteiro de função e um void*para dados do usuário. Uma interface genérica geralmente se parece com isso. Em seguida, a biblioteca passa isso de void*volta ao seu retorno de chamada sem fazer mais nada com ele. Na maioria das vezes, você não possui dados extras; portanto, passa NULL e ignora o parâmetro do usuário no retorno de chamada. Eu presumi que você sabia disso.
Calmarius
@Calmarius "Na maioria das vezes você não tem dados extras" -> Essa é realmente a vantagem do polimorfismo. É fácil vincular dados extras, sem usar ponteiros nulos. Então, sua desculpa é basicamente "eu realmente não uso esse recurso".
user2445507
15

Estou surpreso que ninguém tenha mencionado as bibliotecas. Muitos idiomas podem vincular-se a bibliotecas C e chamar funções C (incluindo C ++ com "C" externo). C ++ é praticamente a única coisa que pode usar uma biblioteca C ++ (definida como 'uma biblioteca que usa recursos em C ++ que não estão em C [como funções sobrecarregadas, métodos virtuais, operadores sobrecarregados, ...] e não exporta tudo através de interfaces compatíveis com C via extern "C" ').

BigSandwich
fonte
1
Não tão; você pode externo "C" ou __cdecl suas funções para expô-los a C.
Crashworks
Ótimo, mas com quais outros idiomas isso funciona?
BigSandwich
2
uma biblioteca C pode funcionar em muito mais lugares.
BigSandwich
1
Todos os que podem conectar-se a C. #
311
2
A razão mais óbvia para os problemas de interoperabilidade é a troca de nomes e acho que vale a pena mencionar.
Tom
15

Se você deseja que seu código seja entendido por praticamente qualquer programador, escreva em C.

Liran Orevi
fonte
12

Porque eles querem usar recursos no C99 que não possuem equivalentes no C ++.


No entanto, não existem tantos recursos do C99 que sejam úteis para o C ++ quanto as pessoas pensam à primeira vista. Matrizes de comprimento variável? C ++ possui std :: vectors. Suporte para números complexos / imaginários? C ++ tem um tipo complexo de modelo. Funções matemáticas genéricas de tipo? O C ++ sobrecarregou as funções matemáticas padrão, causando o mesmo resultado.

Inicializadores nomeados? Não em C ++, mas há uma solução alternativa:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

Isso permite que você escreva coisas como:

My_class mc(My_class_params().set_i(5).set_name("Me"));
Max Lybbert
fonte
Ouça ouça! A falta de inicializadores designados nomeados em C ++ me leva à loucura toda vez que preciso usá-lo.
ephemient
2
Estou com 100% nos inicializadores !!!
Juiz Maygarden
Se você deseja inicializar uma estrutura global fora de uma função (para não poder .set _ * ()), o C ++ obriga a usar a sintaxe do iniciador não nomeado ou a escrever um construtor para sua estrutura. Eu não gosto de nenhuma dessas opções.
#
Também existem VLAs em C99 (GCC) que são muito mais fáceis de trabalhar do que std:vector.
Vahid Amiri
10

Porque para muitas tarefas de programação C é mais simples e bom o suficiente. Quando estou programando utilitários leves especialmente, sinto que o C ++ quer que eu construa uma superestrutura elegante por si só, em vez de simplesmente escrever o código.

OTOH, para projetos mais complexos, a elegância fornece um bom rigor estrutural sólido mais do que naturalmente sairia do meu teclado.

dkretz
fonte
8

A maioria dos recursos significativos do c ++ de alguma forma envolve classes ou modelos. Esses são recursos maravilhosos, exceto pela maneira como o compilador os transforma em código de objeto. A maioria dos compiladores usa nomes desconcertantes e aqueles que não fazem algo pelo menos tão confuso.

Se o seu sistema permanecer por conta própria, como é o caso de muitos aplicativos, o C ++ é uma ótima opção.

Se o seu sistema precisar interagir com um software que não é necessariamente necessário em C ++ (mais frequentemente em assembler ou Fortran Libraries), você estará em uma situação difícil. Para interagir com esses tipos de casos, será necessário desativar a troca de nomes para esses símbolos. isso geralmente é feito declarando esses objetos extern "C", mas eles não podem ser modelos, funções sobrecarregadas ou classes. Se é provável que essa seja a API de seus aplicativos, você precisará envolvê-los com funções auxiliares e manter essas funções sincronizadas com as implementações reais.

E, na realidade, a linguagem C ++ fornece uma sintaxe padrão para recursos que podem ser facilmente implementados em C. puro.

Em resumo, a sobrecarga do C ++ interoperável é muito alta para a maioria das pessoas justificar.

TokenMacGuy
fonte
3
Estou muito surpreso ao ouvir isso porque escrevi tantas .DLLs em C ++ que tinham interfaces externas "C" para que pudessem ser chamadas de C ou de qualquer outra linguagem CLR. Certamente você não pode simplesmente expor ponteiros de função de membro, mas realmente não são muitos os dados do empacotador de problemas para chamadas __cdecl.
Crashworks
1
Na verdade, você pode exportar código de modelo. Requer apenas invólucros de função não modelados para todos os tipos que você deseja usar para evitar colisões de nomes.
juiz Maygarden
8

Isso é bastante superficial, mas como aluno ocupado, escolhi C porque achava que o C ++ levaria muito tempo para aprender. Muitos professores da minha universidade não aceitam tarefas em Python e eu precisava pegar algo rapidamente.

vinc456
fonte
8
Sábio de seus professores!
Andrei Ciobanu 29/03
6

Uma observação sobre "basta usar o subconjunto de C ++ que você deseja usar": o problema com essa idéia é que ele tem um custo para impor que todos no projeto usem o mesmo subconjunto. Minha opinião é que esses custos são bastante altos para projetos de acoplamento fraco (por exemplo, de código aberto) e também que o C ++ falhou totalmente em ser um C melhor, no sentido de que você não pode usar o C ++ onde quer que tenha usado o C.

David Cournapeau
fonte
6

Oh meu, C vs C ++, uma ótima maneira de começar uma guerra de chamas. :)

Eu acho que C é melhor para driver e código incorporado.

O C ++ possui ótimos recursos que o C ++ não possui, mas muitos dos recursos orientados a objeto do C ++ podem causar bagunças monumentais na codificação quando as pessoas escrevem código com efeitos colaterais não óbvios que ocorrem nos bastidores. Código louco pode estar oculto em construtores, destruidores, funções virtuais, ... A beleza do código C é que a linguagem não faz nada não óbvio nas suas costas, assim você pode ler o código e não precisa procurar em todos os construtores e destruidores e assim por diante. Muitos dos problemas são práticas de codificação ruins por ALGUMAS pessoas.

Minha linguagem perfeita seria uma combinação de C99 mais um subconjunto mínimo de recursos C ++ mais seguros que adiciona sobrecarga de compilador ZERO (ou quase zero) à saída binária. Adições perfeitas seriam conceitos de encapsulamento de classe e nomeação de dados e funções.

Iluminação
fonte
Nome C + ou C100: _)
m3nda
4

Não consegui encontrar muitas evidências de por que você desejaria escolher C em vez de C ++.

Você mal pode chamar o que estou prestes a dizer de evidência; é apenas a minha opinião.

Pessoas como C, porque ele se encaixa perfeitamente na mente do programador.

Existem muitas regras complexas do C ++ [quando você precisa de destruidores virtuais, quando pode chamar métodos virtuais em um construtor, como a sobrecarga e a substituição interagem, ...] e dominar todas elas exige muito esforço. Além disso, entre referências, sobrecarga do operador e sobrecarga de funções, entender um pedaço de código pode exigir que você entenda outro código que pode ou não ser fácil de encontrar.

Uma pergunta diferente sobre por que as organizações preferem C sobre C ++. Não sei, sou apenas um povo ;-)

Na defesa do C ++, ele traz recursos valiosos para a mesa; o que eu mais valorizo ​​é provavelmente o polimorfismo paramétrico ('ish): operações e tipos que usam um ou mais tipos como argumentos.

Jonas Kölker
fonte
2
++score: Sua afirmação “Pessoas como C porque se encaixa perfeitamente na mente do programador” é muito bem-declarada. Ser capaz de programar em uma linguagem simples, na qual você sabe que o que vê é o que é uma propriedade realmente atraente para uma linguagem de programação.
precisa saber é o seguinte
3

Eu diria que C oferece a você melhor controle sobre otimização e eficiência que C ++ e, portanto, seria útil em situações em que a memória e outros recursos são limitados e toda otimização ajuda. Ele também tem uma pegada menor, é claro.

Chris
fonte
Você pode dar exemplos disso?
Andrew Grant
Portanto, o mesmo código C compilado usando um compilador C será mais eficiente do que se compilado usando um compilador C ++?
31411 Steve Kuo
1
Anos atrás, o kernel do Linux podia ser compilado com gcc ou g ++, mas o g ++ criou um código mais lento ( tux.org/lkml/#s15-3 em "Finalmente, enquanto Linus mantém o kernel de desenvolvimento ...").
Max Lybbert
Suponho que estava pensando mais na linha de poder controlar mais de como seu código é otimizado em C sobre C ++. Muito parecido com o modo como um programador que usa a linguagem assembly pode ajustar seu código com mais precisão do que aquele que usa uma linguagem de nível superior.
Chris
2

Há também a abordagem que algumas lojas adotam ao usar alguns dos recursos do C ++ de maneira semelhante ao C, mas evitando os que são questionáveis. Por exemplo, o uso de classes e métodos de classe e sobrecarga de funções (que geralmente são fáceis de lidar com os diehards C), mas não o STL, os operadores de fluxo e o Boost (que são mais difíceis de aprender e podem ter características de memória ruins).

Crashworks
fonte
1

Porque você está escrevendo para um sistema em que os recursos são escassos (como um sistema incorporado ou algum tipo de código bare metal real, como um kernel) e deseja o mínimo de sobrecarga possível.

Há uma razão pela qual a maioria dos sistemas embarcados não possui um compilador C ++ - não é que as pessoas não o desejem, é que colocar o código C ++ naquele espaço pequeno é uma tarefa que parece impossível.

Electrons_Ahoy
fonte
3
Não é realmente tanto um problema do C ++ como uma linguagem, mas o inchaço patológico que o uso indiscriminado de modelos pode causar.
Crashworks 31/01/09
1
ecos é amplamente escrito em C ++. Não há relação entre o idioma (comparado a C) e o tamanho do executável (desde que você saiba quais recursos usar).
user52875
1
"desde que você saiba quais recursos usar". Esse é o ponto - o resultado de dizer "bem, nós temos C ++, mas não podemos suportar metade dos recursos da linguagem por motivos de sobrecarga" é o Symbian / C ++, que confunde e irrita os programadores C e os programadores C ++ ...
Steve Jessop
1
Concordou em todos os pontos. Nossa solução para "saber quais recursos usar" era apenas usar um compilador C e chamá-lo por dia. Claro, poderíamos ter feito o C ++ funcionar (o que seria muito divertido de uma maneira super-nerd), mas tínhamos um produto a ser enviado e não havia tempo para nos preocupar com isso.
Electrons_Ahoy
1

O que C precisava era de um pré-processador melhor. cfront era um e assim nasceu c ++

Eu usaria C, onde o 'c ++ como pré-processador' não seria bom.

Tenho certeza de que, na parte inferior de qualquer biblioteca / framework / kit de ferramentas c ++ bem escrita, você encontrará dirty-old-c (ou estática, que é a mesma)

vrdhn
fonte
0
  • Até alguns anos atrás, os compiladores C ++ existentes estavam faltando recursos importantes, ou o suporte era fraco e os recursos suportados variam muito entre eles, e era difícil escrever aplicativos portáteis.
  • Devido à nomenclatura padrão dos símbolos, é difícil para outros idiomas / aplicativos oferecer suporte diretamente às classes C ++.
Ismael
fonte