Devo parar de usar o termo C / C ++?


140

Eu entendo que C e C ++ são linguagens diferentes, mas quando eu estava aprendendo C ++, sempre me disseram que C é um subconjunto de C ++ ou C ++ é C com classes. E isso era verdade até o surgimento de C ++ x0, C ++ 11 (ou o moderno C ++ 11/14/17 em geral). De fato (especialmente ao trabalhar em sistemas embarcados), é muito provável que encontre código escrito em C ++, mas com muitas partes escritas inteiramente em linguagem C pura. Aqui eu tenho várias perguntas:

  1. Devo parar de usar o termo C / C ++?
  2. Se a resposta para o número 1 for sim, como eu chamaria um programa que usa uma combinação de C e C ++?
  3. Dado que os dois são linguagens 'diferentes', é provável que em algum momento os compiladores C ++ parem de oferecer suporte ao código escrito na linguagem C (já que o c ++ moderno está divergindo da mentalidade C para itens básicos como ponteiros, manipulação dinâmica de memória etc.)
  4. Existe agora alguma colaboração entre as pessoas que fazem os padrões de C / C ++ para manter a compatibilidade
  5. Se o # 4 for sim, essa colaboração pode acabar em um futuro próximo com o surgimento do moderno c ++ (14/11/17)

Eu sei que já existem perguntas semelhantes, mas tenho certeza de que muitas pessoas compartilham essas perguntas, por isso estou muito interessado em obter boas respostas, especialmente para os pontos que têm a ver com a tendência de C ++ em um futuro próximo.


35
E isso foi verdadeiro até a aparência de C ++ x0, C ++ 11 Não, C89 não é um subconjunto de C ++ 98.

35
Should I stop using the term C/C++. Sim. Isso é usado apenas por recrutadores e RH. Os engenheiros usarão o termo Cou C++como idiomas independentes. Se você encontrar um engenheiro que mistura o termo, evite-o.
Martin York

8
@LokiAstari: sério? Eu acho que os desenvolvedores SQLite são de RH, já que eles não têm posições em aberto. Essa é uma visão incrivelmente restritiva (por favor, vote e diminua minha resposta como outras pessoas na sua situação).

4
@greyfade: É ruim supor que alguém, em qualquer lugar, possa reivindicar uma sequência de caracteres comumente vista. "C / C ++" pode ser o nome escolhido para um determinado idioma, mas isso não significa que o uso de "C / C ++" se refira a esse idioma, assim como se eu copiasse o site e substituísse "C / C ++" por "C ++ 1z" que toda discussão sobre o rascunho do padrão C ++ usaria subitamente terminologia incorreta. Simplificando, a string "C / C ++" nunca se referiu a essa linguagem de piada chamada "C / C ++" e nunca será.
Ben Voigt

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "No sentido matemático estrito, C não é um subconjunto de C ++ ... No entanto, C ++ suporta todas as técnicas de programação suportadas por C ... Não é incomum conseguir converter dezenas de milhares de linhas de C ++ em estilo C em poucas horas.Portanto, o C ++ é tanto um superconjunto do ANSI C quanto o ANSI C é um superconjunto do K&R C e o ISO C ++ é um superconjunto de C ++ como existia em 1985. C bem escrito também tende a ser legal em C ++. Por exemplo, todos os exemplos em Kernighan & Ritchie: "A linguagem de programação C (2ª edição)" também é um programa em C ++. "
Ben

Respostas:


183

C nunca foi um subconjunto de C ++. O exemplo mais óbvio disso é int new;. Isso acontece desde C89 e C ++ 98, e as linguagens cresceram um pouco mais quando surgiram novos padrões.

Devo parar de usar o termo C / C ++

sim

Se a resposta para o número 1 for sim, como eu chamaria um programa que usa uma combinação de C e C ++?

Um arquivo de origem é escrito em um idioma ou no outro. Um programa pode consistir em código de vários idiomas trabalhando juntos ou em um executável produzido ao vincular diferentes objetos compilados. Você diria que o programa foi escrito em C e C ++, "C / C ++" não é uma linguagem.

Dado que os dois são linguagens 'diferentes', é provável que em algum momento os compiladores C ++ parem de oferecer suporte ao código escrito na linguagem C

3) Eles nunca fizeram. char *a = malloc(10);. C e C ++ nunca foram totalmente compatíveis pelo menos desde que tivessem os padrões ISO (não conheço todos os detalhes sobre os dias pré-padronizados). clique nos links ou veja abaixo um arquivo compatível com C89 e superior, mas que não é válido sob nenhum padrão C ++.

4) depois que não, os grupos de trabalho estão cientes um do outro, mas os padrões tomam as decisões que são melhores para si.

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

Eu sempre sinto que vale a pena mencionar que C é um subconjunto de Objective-C.


59
O Objective-C foi projetado especificamente para ser um superconjunto estrito de C, sem sintaxe conflitante e um sistema de objetos totalmente ortogonal. Isso é levado a tal extremo que você pode pegar a parte "Objective" de "Objective-C" e conectá-la a outros idiomas, criando, por exemplo, Objective-MODULA-2. E, o mais famoso, o Objective-C ++ da Apple, que apresenta dois sistemas de objetos completamente ortogonais, sem interação e não integrados.
Jörg W Mittag

20
@masonwheeler se o OP quiser ver como é um superconjunto real de C.
Xhainingx

26
"Um arquivo de origem é escrito em um idioma ou no outro." Diga isso ao meu programa, que é compilado corretamente como padrão C99 e C ++ 89. Nenhum dos idiomas é um subconjunto do outro, mas há uma interseção dos dois conjuntos que é amplamente segmentada. Veja Lua, et al.
munificent

28
@ Magnífico Eu posso escrever código C ++ que também pode ser executado javac, mas qual seria o objetivo?
Xhainingx

22
@munificent Um exemplo de um programa que pode ser compilado em três idiomas - C, / bin / sh e f77 - é a entrada applin.c da IOCCC 1986. De acordo com sua definição, a tag C/Fortran/shfaz sentido agora ?! ioccc.org/years-spoiler.html#1986 .
Sjoerd

108

Não tem que haver uma razão por que esses termos se reúnem tantas vezes. Embora você não deva dizer ao seu professor de C que a linguagem dele é um subconjunto de C ++, há alguma verdade aqui. Outros já expuseram o ponto de vista do seu professor. Isso é muito bom (e ilustrado com exemplos, etc.). Mas não vivemos em uma torre de marfim ou em um livro.

Seu grande chefe não se importava com o idioma exato que você usava. Se ele souber um pouco de programação, diga-lhe que você usou C / C ++ e isso soará como "Eu usei uma linguagem que precisa ser compilada no código da máquina, com DLLs e todas as coisas complicadas". Esta é a parte "comunicação externa".

Se você criar uma biblioteca que pode ser conectada por C e C ++, você definitivamente deseja chamá-la de biblioteca C / C ++. Obviamente, alguém levantará a mão e perguntará por que você não chama isso de biblioteca C que possui um wrapper C ++ e, de qualquer maneira, o C ++ pode se vincular às bibliotecas C, para que você não precise mencioná-lo. Apenas responda: "Sim, você está certo, esta é uma biblioteca C / C ++". Esta é a parte "comunicação interna".

Se você criar um analisador lexical para C ++, ficará surpreso com o quão bem ele funciona com C. Você pode nem precisar modificar tudo. Este é o "se parece um pato, etc." parte.

Etc.

A maioria dos programas em C que eu já vi compilar (e trabalhar) sem modificação como código C ++. Não deixe que algumas exceções ou programadores dogmáticos (por mais influentes) enganem sua intuição. C e C ++ são tão próximos, e tantas vezes compatíveis, e tantas vezes misturados e combinados, que o termo C / C ++ é usado. É usado porque é útil descrever esses tipos de situações em que realmente não importa se você está considerando C ou C ++, desde que não seja Java ou PHP . Sabemos que é "errado", mas não nos importamos, é mais útil do que errado.

Pode ser abusado, pode ser estúpido, mas, ainda assim, não tenho certeza de qual benefício você obterá por ser mais pedante do que o necessário e se recusar a se comunicar em termos que os outros entendem. Se você se sentir desconfortável em alguma situação específica, simplesmente não use o termo genérico C / C ++, mas o relevante para o caso (C ou C ++).

Não tenha medo do futuro. Nossos sistemas operacionais são escritos em C. Grande parte da produção atual de software em C / C ++ acontece em C ++. Este casal está aqui para ficar por um bom tempo. Ninguém tem interesse em que um se torne mais incompatível com o outro (na verdade, ao contrário).

Para ser específico sobre seus pontos:

1) Depende. Sim, quando isso pode causar confusão, quando você se sente desconfortável ou quando está simplesmente errado ou fora de contexto. Não quando você acha que é adequado.

2) N / D

3) Acho que não, mas não tenho bola de cristal.

4) nenhuma ideia

5) Eu não penso assim, porque nada empurra nessa direção


7
Comentários removidos porque estavam ficando barulhentos.
ChrisF

3
Por que isso tem tantos votos positivos? Está cheio de imprecisões e falsas alegações!
Zaibis 05/10

5
@Zaibis, você gostaria de expandir quais reivindicações são falsas ou imprecisas?
userNumber

3
Seguindo sua lógica, C / C ++ / Objective-C / Fortran / Pascal deve ser uma expressão válida, mas isso parece bobagem. O problema com o termo C / C ++ é que ele pode significar várias coisas, então você não tem garantia de que irá converter o significado desejado. Na minha prática, as pessoas geralmente entendem isso como "C é apenas uma versão primitiva antiga do C ++" e isso é errado.
martinkunev

4
Além da validade intrínseca do termo, C/C++não é clara e, portanto, não é útil. Seguindo seus exemplos, a C/C++ librarypoderia significar uma biblioteca C com um wrapper C ++ ou uma biblioteca C ++ com um wrapper C. Ou pode significar que a biblioteca é composta de vários módulos, alguns compilados usando C ++, outros compilados em C. Isso não está claro. Para mim, dizer que uma biblioteca é feita C and C++é muito mais claro, ou C library with compatibility with C++também muito mais claro. E aqui a ambiguidade é com apenas dois lang, imagine usar esta "estratégia de comunicação" para mais ...
gaborous

43

Indo contra o fluxo, eu diria que depende do contexto .

O termo "C / C ++" geralmente não é apropriado quando se diz algo como "este é um programa C / C ++", mas isso foi explorado em profundidade em outras respostas.

No entanto, pode haver contextos em que o C / C ++ pode ser apropriado.

  • Existem várias bibliotecas que geralmente têm uma API C e uma C ++. Eu acho que não está longe da verdade se você chamar uma biblioteca de C / C ++ assim. Nós, humanos, gostamos de compactar informações, dizendo que "opencv é uma biblioteca C / C ++" é curto, claro e compreensível, comparando-o com dizer "opencv é uma biblioteca fornecida com cabeçalhos para C e C ++".
  • Você pode falar sobre o design e a sintaxe da linguagem. Do ponto de vista da sintaxe da linguagem, você pode dizer que uma linguagem possui sintaxe semelhante ao C / C ++.
  • Você organiza um concurso de codificação e aceita as duas soluções escritas em C e em C ++
  • Você está contratando um novo programador, e a maioria das tarefas será C ou C ++, portanto, espera-se que o programador conheça os dois idiomas. É comum no desenvolvimento incorporado, onde C é mais adequado para alguns microcontroladores (geralmente muito pequenos) e C ++ para outros. Nesse caso, você pode dizer que está procurando um programador C / C ++.

10
Vejo essas posições contra o consenso geral aqui no P.SO. (onde você deve aprovar qualquer coisa que pareça "ágil / exagerada / como A Única e Única Coisa Certa" e desconsiderar o restante) é tão bem-vinda quanto de costume. Pessoal, a programação não é uma religião, e este site não é um livro sagrado.

16
O último ponto de bala na verdade mostra um grande problema: Você está olhando (1) para uma pessoa que knowns qualquer C ou C ++, (2) uma pessoa que sabe tanto C e C ++ ou (3) uma pessoa que está confuso ao ouvir estas são idiomas diferentes. Não ajude a terceira piscina a crescer.
5gon12eder

10
O último ponto seria melhor expresso como "programador com experiência em C e C ++" se é isso que você está realmente procurando. Um anúncio de emprego intitulado "programador" que, na experiência necessária, lista as listas "C e C ++" ou "C ou C ++" não é significativamente diferente de um intitulado "programador" e lista "C / C ++" como uma qualificação necessária, mas é muito mais exato. O tipo de pessoa que você procura para um emprego assim pode muito bem apreciar essa exatidão de expressão.
um CVn

10
Na linguagem escrita, o '/' é geralmente interpretado como lógico or, não como lógico xor. Então é um ou ambos. Nas listagens de emprego, você conhece C ou C ++ ou ambos. Agora, sinto que muitas pessoas estão sendo religiosas sobre o termo. Um bom programador de C ficará perfeitamente bem em pegar C ++ independentemente da diferença entre as duas linguagens. Comecei a codificar o PHP e depois mudei para o Scala (duas linguagens completamente diferentes) Por que um programador em C não poderia pegar C ++ ou vice-versa? O termo C / C ++ tem algum mérito se usado dentro do contexto correto.
ILikeTacos # 1/15

4
Você também pode usar C / C ++ para descrever um programa que deve funcionar quando compilado como C ou C ++, ou um programa com componentes C e C ++ separados.
immibis

30

Em geral, os usuários de SO solicitam à pessoa que está fazendo a pergunta que escolha um idioma: C ou C ++. Por quê?

Existem muitas diferenças sutis entre C e C ++. Por exemplo, em C ++, uma constvariável no escopo global tem ligação interna, a menos que seja declarada extern, mas em C ela possui ligação externa, a menos que seja declarada static. Ao dizer "C / C ++", o OP está afirmando que a resposta para sua pergunta é a mesma em C e C ++, quando pode muito bem não ser. Isso desnecessariamente torna as coisas mais difíceis para os possíveis respondentes.

  • Às vezes, podemos perceber que o código não é válido em um idioma ou no outro (por exemplo, conversões implícitas de void*para ponteiro em objeto não são válidas em C ++). Isso é chato. Por que você está dizendo "C / C ++" quando possui um pedaço de código válido em C, mas não em C ++? Você pretendia C, ou isso é apenas um erro no código destinado a ser C ++?

  • Às vezes, a resposta será diferente dependendo do idioma (por exemplo, matrizes de tamanho variável existem em C99, mas não em C ++). Se não sabemos de que idioma você está falando, precisamos adivinhar ou escrever uma resposta para ambas, quando apenas uma será realmente útil, porque você sabe qual idioma está realmente usando; você simplesmente não está nos dizendo!

  • Às vezes, a resposta é realmente a mesma para os dois idiomas, mas é difícil ter certeza. Por exemplo, acho que C e C ++ têm as mesmas regras de conversão de números inteiros, mas, para ter certeza, preciso ler os dois padrões com atenção. Novamente, isso me faz fazer o dobro do trabalho necessário quando você provavelmente se importa apenas com um dos idiomas.

Enfim, para responder suas outras perguntas:

  1. Sim.

  2. Se você estiver vinculando os códigos C e C ++, é aceitável usar as duas tags, mas especifique em qual idioma cada arquivo está.

  3. Às vezes, há mudanças significativas, mas são raras e geralmente têm impacto limitado (caso contrário, não são aprovadas). Por exemplo, autoem C ++ 11.

  4. Não acho que eles colaborem diretamente, mas prestam atenção aos desenvolvimentos no outro idioma e tentam evitar a introdução de mudanças que tornariam a compatibilidade mais difícil.

E se você realmente quer conhecer os dois idiomas, tudo bem, e você pode dizer isso na sua pergunta. Quando você diz "C / C ++", não tenho muita certeza do que você quer dizer e parece que você está assumindo as duas linguagens.


7
Eu sei que existem pessoas que escrevem código na interseção de C e C ++ e usam um compilador C ++ para digitação, mas um compilador C para geração de código. Não tenho idéia se isso realmente faz sentido ou não. No entanto, é um tópico que aparece a cada dois anos na lista de discussão do Kernel do Linux, quando alguém envia um patch para renomear o (muito importante no Modelo de Driver Orientado a Objeto Unificado do Kernel do Linux) struct classpara algo struct klassexatamente por esse motivo, e então é invariavelmente abatido por Linus.
Jörg W Mittag

3
@ JörgWMittag: Eu nunca conheci alguém que usasse "C / C ++" como uma abreviação para "o subconjunto comum de C e C ++" e também sabia do que estava falando. As pessoas que trabalham intencionalmente no subconjunto comum tendem a tornar isso explícito ao não abreviar.
Bart van Ingen Schenau

2
Esta é uma boa resposta especificamente sobre o uso do C / C ++ nas perguntas do Stack Exchange , e não em geral.
immibis

@BartvanIngenSchenau Quantos membros do comitê std você conheceu?
curiousguy

18

Sempre me disseram que C é um subconjunto de C ++ ou C ++ é C com classes. E isso foi absolutamente verdadeiro até o aparecimento de C ++ x0, C ++ 11 (ou o moderno C ++ 14/11/17 em geral).

C nunca foi um subconjunto de C ++. Por exemplo, C89 não é um subconjunto do C ++ 98.

Alguns exemplos:

  • o formulário da lista de identificadores C89 para declaração de parâmetro de função não é suportado em C ++
  • C89 e C ++ 98 têm tipos diferentes para as constantes de caracteres
  • C89 e C ++ 98 têm tipos diferentes para literais de string
  • operadores lógicos produzem tipos diferentes em C89 e C ++ 98 ( intvs bool)
  1. Devo parar de usar o termo C / C ++?

Sim.

  1. Se a resposta para o número 1 for sim, como eu chamaria um programa que usa uma combinação de C e C ++?

Um programa é C ou C ++ (se mesmo algum programa muito básico puder ser compilado com um compilador C ou C ++). Qual compilador você está usando para compilá-lo? Deve responder sua pergunta. Harbison & Steele cunharam o termo Clean C para designar um subconjunto comum de C e C ++, mas acho que foi uma má ideia.

Edição : No entanto, admito que tecnicamente você pode vincular arquivos de objetos C e C ++ em um único programa, mas OTH existem muitas linguagens que podem ser misturadas em um único programa, por exemplo, Java e C ++. Eu acho que o uso do termo programa C / C ++ apenas aumenta a confusão de que ele está escrito em uma única linguagem chamada C / C ++.

  1. Dado que os dois são linguagens 'diferentes', é provável que em algum momento os compiladores C ++ parem de oferecer suporte ao código escrito na linguagem C (já que o c ++ moderno está divergindo da mentalidade C para itens básicos como ponteiros, manipulação dinâmica de memória etc.)

Existem muitos recursos (exemplo: matriz de comprimento variável, membro flexível da matriz _Generic, ...) do C99 ou C11 que não são suportados por nenhuma versão do C ++.


Re programas multi-linguagem: um programa que usa JNI extensivamente pode ser chamado de programa C / Java. O fato de dois idiomas serem usados ​​juntos não significa que eles sejam compilados juntos.
immibis

1
stroustrup.com/bs_faq.html#C-is-subset "No sentido matemático estrito, C não é um subconjunto de C ++ ... No entanto, C ++ suporta todas as técnicas de programação suportadas por C ... Não é incomum ser capaz de converter dezenas de milhares de linhas de C em C ++ no estilo C em poucas horas.Portanto, o C ++ é tanto um superconjunto do ANSI C quanto o ANSI C é um superconjunto do K&R C e o ISO C ++ é um superconjunto do C ++ como existia em 1985. C bem escrito também tende a ser legal em C ++. Por exemplo, todos os exemplos em Kernighan & Ritchie: "A linguagem de programação C (2ª edição)" também é um programa em C ++.
Ben

@Bem o primeiro programa (olá mundo) em "A linguagem de programação C (2ª Edição)" omite o tipo de retorno principal principal que é inválido em C ++.
ouah

1
@ouah, parece que o professor Stroustrup perdeu um deles :-) Observe que isso também não é permitido no C11 :-) Certamente, isso foi permitido nas versões anteriores do C ++.
Ben

4
@ouah, essa não é a primeira versão do C ++. O livro é de 1988 e naquela época nenhum dos idiomas era um padrão ISO. A versão atual do C ++ na época era o livro de Bjarne Stroustrup de 1985.
Ben

17

Alguns programas são escritos em uma mistura de C e C ++

Isso é apenas um fato da vida. Você pode compilar arquivos de objetos de C e C ++ e vinculá-los. O resultado pode ser razoavelmente chamado de "um programa C / C ++".

Mas esse é apenas o programa como um todo. E as unidades de compilação individuais?

Há um subconjunto de C que também é um subconjunto de C ++

Um programa (ou unidade de compilação) escrito nesse subconjunto compilará e se comportará da mesma maneira nos compiladores C e C ++ em conformidade. Esse programa ou arquivo pode ser chamado corretamente de "um programa C / C ++" ou "um arquivo C / C ++".

Um programa parcial, como um arquivo de cabeçalho, também pode ser usado nos programas C e C ++. Esses arquivos de cabeçalho podem ser corretamente chamados de cabeçalhos C / C ++.

Citando o professor Bjarne Stroustrup:

C é um subconjunto de C ++?

No sentido matemático estrito, C não é um subconjunto de C ++. Existem programas que são válidos em C, mas não são válidos em C ++ e até mesmo algumas maneiras de escrever código com um significado diferente em C e C ++. No entanto, o C ++ suporta todas as técnicas de programação suportadas pelo C. Todo programa C pode ser escrito essencialmente da mesma maneira em C ++ com a mesma eficiência de tempo de execução e espaço. Não é incomum poder converter dezenas de milhares de linhas de ANSI C em C ++ no estilo C em poucas horas. Assim, C ++ é um superconjunto de ANSI C tanto quanto ANSI C é um superconjunto de K&R C e, tanto quanto ISO C ++ é um superconjunto de C ++, como existia em 1985.

C bem escrito tende a ser legal em C ++ também. Por exemplo, todos os exemplos do Kernighan & Ritchie: "A linguagem de programação C (2ª edição)" também são um programa C ++.

Então, sim, existe algo como C / C ++. É qualquer coisa que seja C válido e C ++ válido.

O pré-processador C faz parte da linguagem C. O pré-processador C ++ faz parte da linguagem C ++

Você pode escrever uma unidade de compilação que será compilada em C ou C ++ e será diferente . Por exemplo, pode ter funcionalidade básica compilada em C, mas tirar proveito de uma biblioteca C ++ se compilada em C ++.

Se o programa for essencialmente o mesmo, mas com recursos adicionais, não é exatamente errado dizer que é o mesmo programa. É o mesmo, mas também diferente.

A maioria dos programadores de C pode fazer pelo menos um pouco de C ++ e vice-versa

Não é irracional chamar essa pessoa de programador de C / C ++. Sim, eles provavelmente especializar em uma, mas existe alguém que é um C competente ou programador C ++ que literalmente não pode fazer qualquer da outra língua? De certa forma, eles não são todos programadores em C / C ++?

Não há nada de errado em dizer "C / C ++". O que importa está sendo entendido

O idioma inglês não é uma ferramenta para expressar silogismos . Você pode usar o inglês para lógica, mas apenas apenas e com muito esforço.

Isso ocorre porque as palavras naturalmente não têm significados exatos, mas uma vaga nuvem de denotações e conotações. O que importa é se as pessoas entenderem o que você está dizendo.


5
@ BЈовић Eles discordam de você sobre a aceitabilidade de um pequeno pedaço de terminologia, então você conclui que eles não entendem a diferença e são incompetentes. É uma coisa bastante irracional de se dizer.
Ben

4
@ el.pescado Sim. Você verá que as pessoas de fato se referem ao PHP / JavaScript. Por que não? O ponto é para ser entendido, não para jogar com palavras.
Ben

10
@ Bћовић Você não está fazendo sentido. Eles não são "completamente diferentes". C ++ é uma linguagem muito maior que C, mas inclui quase todo o C dentro dele. Existem incompatibilidades que impedem o C ++ de ser um superconjunto adequado, mas elas são pequenas, como palavras reservadas adicionais, tornam-se necessárias mais algumas transmissões, mas é praticamente isso. É quase um superconjunto adequado, mas não exatamente.
Ben

7
@ BЈовић Talvez você não tenha entendido o que eu escrevi. Por que você não olha aqui para ver como, em todos os casos, é possível adaptar um programa C para que ele também seja compilado como C ++. david.tribble.com/text/cdiffs.htm#C99-vs-CPP9 #
Ben Ben

7
@ Bћовић Se você é pedante em termos de terminologia, deve estar ciente de que C não é " funcional ", mas sim " processual " - uma diferença que você pode querer entender antes de lançar acusações de incompetência a outras pessoas.
RM

15
  1. Devo parar de usar o termo C / C ++?

Absolutamente. Não está claro o que essa construção pretende expressar, exceto, talvez, a confusão sobre o que C e C ++ são em nome da pessoa que usa o termo.

Como essa confusão é uma fonte comum de frustração, muitas pessoas se emocionam com isso, e a aparência desse termo por si só será motivo suficiente para que se tornem negativas em relação à sua contribuição. Isso pode parecer bobagem, mas parece ser o que temos.

Eu recomendo que, em vez de falar sobre “C / C ++”, você use um termo que realmente deixe claro o que você quer dizer.

  • Se você está falando sobre algo em C que pode ou não pode também ser verdade para C ++, simplesmente dizer C .

    Exemplo: como a mainfunção deve ser declarada em C?

    A princípio, pode parecer que a resposta para C ++ seja a mesma: int main()ou int main(int, char**). Mas, à medida que a discussão prossegue, pode ser relevante ressaltar que em C ++, a função deve ser declarada no escopo global, o que não faz sentido em C, porque não possui namespaces. Por outro lado, C permite chamar mainrecursivamente enquanto C ++ não. No C ++, há um implícito return 0;se você "cair", mainmas no C a returninstrução é necessária em qualquer caminho. A lista continua e torna a discussão muito mais simples se você esclarecer de antemão qual é o idioma a ser discutido.

  • Se você está falando sobre algo em C ++ que pode ou não ser verdadeiro para C, basta dizer C ++ .

    Exemplo: Uma malloc()matriz ed de ints será inicialmente todos-zeros em C ++?

    A resposta curta para C é a mesma: não. Mas, como a resposta continua, pode valer a pena ressaltar que, em C, callocseria uma boa alternativa, enquanto em C ++, o uso de uma std::vector<int>poderia ter sido uma escolha melhor em primeiro lugar.

  • Se você quiser destacar uma semelhança entre C e C ++, diga C e C ++ .

    Exemplo: Em C e C ++, o sizeofan inté uma implementação definida e pode variar entre compiladores e arquiteturas.

    Aqui, queremos ressaltar que C e C ++ se comportam da mesma maneira. Estamos falando explicitamente sobre os dois idiomas.

Na verdade, eu recomendo que você seja ainda mais específico e não apenas fale sobre "C" ou "C ++", mas a versão precisa. Ambas as línguas estão evoluindo e uma afirmação contundente, como

O C ++ suporta /* … */e // …comenta enquanto o C suporta apenas o /* … */estilo.

não é certo nem errado.

  1. Se a resposta para o número 1 for sim, como eu chamaria um programa que usa uma combinação de C e C ++?

Como as linguagens se sobrepõem, todo programa em C conterá partes que podem se parecer com C ++ e vice-versa. No entanto, os autores provavelmente terão decidido usar um compilador C ou C ++. Assim, diga "o programa é escrito em C " se for compilado com um compilador C e "o programa é escrito em C ++ " se eles usarem um compilador C ++, mesmo que possam se recusar a usar qualquer recurso moderno do C ++. Algumas pessoas se referem a tal código C ++ como estilo C C ++ . Ausência de sobrecarga, exceções, polimorfismo, modelos e fluxos de E / S são características comuns desse código.

Se, em vez disso, alguns arquivos forem gravados em C e compilados com um compilador C e outros forem gravados em C ++ e compilados com um compilador C ++ e, em seguida, os arquivos de objetos vinculados, eu diria que “o programa é escrito em um mistura de C e C ++ ”, como você já fez.

No entanto, se, em vez disso, os autores tomarem muito cuidado para escrever todos os arquivos de forma que possam ser compilados com um compilador C ou C ++ e o programa resultante faria a mesma coisa, você poderia dizer que “o programa é escrito em um subconjunto comum de C e C ++ ”.

Geralmente, o último é o caso dos arquivos de cabeçalho que devem ser compartilhados entre os códigos C e C ++. Escrever esse código não é fácil, a propósito. Se você quiser enfatizar ainda mais que apenas tais construções foram usados que são válidos em C e C ++ e são amplamente apoiados por diferentes fornecedores do compilador, o termo um portátil subconjunto comum de C e C ++ pode ser usado para enfatizar isso.

  1. Dado que os dois são linguagens “diferentes”, é provável que em algum momento os compiladores C ++ parem de oferecer suporte ao código escrito na linguagem C (já que o C ++ moderno está divergindo da mentalidade C para itens básicos como ponteiros, manipulação dinâmica de memória etc.)?

Não sei se entendi essa pergunta. Como C e C ++ são linguagens diferentes, não é de esperar que um compilador aceite um programa escrito para o outro. No entanto, os compiladores geralmente são projetados de maneira modular e, se um compilador tiver um front-end em C ++ , é provável que ele também tenha um front-end em C. (Você selecionaria então qual deles deseja por meio de uma opção de linha de comando ou meios semelhantes.) Enquanto os dois idiomas estiverem em uso generalizado, parece muito improvável que isso mude. O seu ponto de vista sobre "C ++ moderno", acho que é basicamente uma questão de bons padrões de codificação e da biblioteca padrão. Do ponto de vista do compilador , a evolução de ambas as línguas é mais convergente do que divergente.

  1. Existe agora alguma colaboração entre as pessoas que fazem os padrões de C / C ++ para manter a compatibilidade?

Sim. O modelo de memória e a biblioteca de operações atômicas introduzidas no C ++ 11 e C11 são um bom exemplo. Parece que os designers das duas línguas percebem que a compatibilidade é importante e estão trabalhando para melhorá-la. Pessoalmente, eu gostaria que a colaboração fosse mais intensa e que os dois grupos de trabalho da ISO talvez se juntassem, mas meus desejos não são importantes.

Bjarne Stroustrup fala sobre as diferenças e semelhanças entre as várias versões de C e C ++ no § 44.3 da 4ª edição da The C ++ Programming Language que, ironicamente, é intitulada “Compatibilidade com C / C ++”. O uso do termo pode realmente ser apropriado nesse caso, pois fica claro o que isso significa.

  1. Se o # 4 for sim, essa colaboração pode acabar em um futuro próximo com o surgimento do C ++ moderno (14/11/17)

Como discutido acima, aconteceu no C ++ 11 e é esperado / esperado / necessário que ocorra novamente.


Como pode não estar certo nem errado?
JDługosz

4
Não possui um valor de verdade bem definido, como é o caso da afirmação de que "as coisas verdes são caras". Para uma combinação específica de versões de C e C ++, é verdade, para outras, é falsa.
precisa saber é o seguinte

5

C / C ++ é a interseção de C e C ++.

int new;não é C / C ++ e nem é vector<int> foo;.

Da mesma forma, C89 / C99 é a interseção desses dois idiomas, onde nenhum enum bool { false, true };ou for(int i = 0;;)é permitido.

E C ++ 11 / C ++ 14, etc.

É possível escrever código que compila (e executa corretamente) em C ++ 11 e C ++ 14, embora a compilação em um não implique que ele seja compilado em outro. De fato, muitas pessoas fazem isso.

E muitas pessoas escrevem código que funciona em C e C ++.

Obviamente, quanto maior a sobreposição, mais sentido faz; Não espero ver nenhuma pergunta sobre o código C / C ++ / Java.


Embora "faça sentido" falar sobre um subconjunto comum desses idiomas, muitas perguntas não terão respostas nesse subconjunto, por exemplo, o que deve retornar main () em C e C ++?

Mas você pode falar sobre o código que funciona para várias especificações de idioma, se essas especificações são diferenciadas por "versão" ou "nome do idioma" ou não.


3

Essa é uma resposta à posição de que "este é um código para programadores que trabalham próximos ao metal e que estão bem em um contexto de gerenciamento" visto em algumas das outras respostas e comentários.


Eu diria que mesmo essa interpretação deve ser tomada com cuidado.

Começando pelo menos em meados dos anos 90, se você quisesse um programador C ++ e alguém que se descrevesse como um programador C aplicado, você teria que perguntar o quanto eles sabem sobre design orientado a objetos, quanta experiência eles têm com a depuração em um objeto contexto orientado e sobre sua capacidade de usar bibliotecas de modelos. Você deseja investigar exatamente esses problemas durante o processo de entrevista e contratação.

Por outro lado, já faz mais de uma década que os gurus de C ++ começaram a pressionar o "C ++ moderno", o que significa ênfase na mudança de ponteiros simples para objetos mais seguros e expressões idiomáticas baseadas em iteradores. Com o surgimento do C ++ 11, agora existe um suporte explícito à programação multiparadigmas, e o impulso em direção ao código que não exibe indicadores simples é muito forte. O que isso significa é que, se eu entrevistei um programador de C ++ para uma posição C hoje, ficaria muito preocupado em verificar o quanto essa pessoa estava familiarizada com os ponteiros reais habilitados para disparar com os pés.

Atualmente, não estou no ramo (até o nível em que eu estava quando o Stack Overflow estava em sua infância), por isso não vou adivinhar a frequência com que um dos entrevistados imaginários não teria as habilidades de cruzamento, mas Penso que, na maioria das vezes aplicadas, as línguas são agora muito diferentes.

Em resumo, "C / C ++" deve ser descartado não apenas em contextos técnicos, mas também na maioria dos contextos comerciais.


Uma boa maneira de apontar que a ambiguidade de se significar "C ou C ++, quem sabe", "C e C ++, vinculados", "C e C ++, a interseção" ou "C ou C ++, quem se importa" é cada vez menos justificável, mesmo onde alguém poderia se safar de alguma forma.
Deduplicator

2

A resposta mais simples para essa pergunta é que você nunca deveria ter usado esse termo. É um termo que não deveria existir. Não tem sentido. Todo programa é C ou C ++.

E isso foi absolutamente verdadeiro até o aparecimento de C ++ x0, C ++ 11 (ou o moderno C ++ 14/11/17 em geral).

C ++ 98 e 03 também não são remotamente C com Classes. Quem te ensinou isso não sabe nada e você pode esquecê-los. Isso nunca foi correto.


Isso não é inteiramente verdade. Houve uma vez uma página que descreveu uma especificação de linguagem proposta para uma linguagem chamada "C / C ++" que, entre outras coisas, especificou a (quase) ausência de um sistema de tipos. Infelizmente, a página foi retirada e o site que a hospedava colocou um robots.txt que apagou a cópia arquivada de archive.org.
greyfade

1
Ah, encontrei uma cópia em archive.is: Justificativa , Sintaxe e Semântica .
Greyfade #

5
"Todo programa é C ou C ++." Discordo. É bastante comum pegar um programa em C e portá-lo para C ++, um arquivo por vez (alterando uma opção de compilador para esse arquivo). Alguns arquivos talvez nunca sejam portados e permaneçam em C para sempre. Esse programa é escrito em C e C ++
nikie

Na verdade não. Esse programa é composto de subprogramas, cada um dos quais é C ou C ++. Cada TU, que é o programa inteiro no que diz respeito ao compilador, é compilada como C ou C ++.
DeadMG

3
Não é o caso que "Todo programa é C ou C ++". O professor Bjarne Stroustrup diz: 'C bem escrito tende a ser legal em C ++ também. Por exemplo, todos os exemplos do Kernighan & Ritchie: "A linguagem de programação C (2ª edição)" também são um programa C ++. ' stroustrup.com/bs_faq.html#C-is-subset
Ben

1

Conceitualmente, não deve haver nenhuma dificuldade em particular ao projetar arquivos de origem C para que eles também possam ser compilados como estão no C ++. De fato, pode haver algumas vantagens significativas em fazer isso. Por exemplo, ao escrever código para um sistema incorporado, às vezes é útil poder testar o código em um ambiente de PC hospedado. Se o código compilar corretamente como C ++, é possível ter uma instrução como "MOTOR_ENABLE = 1;" gravar em um bit de E / S volátil no sistema incorporado (compilado como C), mas acionar a lógica de emulação no PC (compilando como C ++). Provavelmente também seria possível projetar um tipo C ++ no PC que se comportasse da maneira que um uint16_t se comporta em sistemas embarcados menores (de modo que, por exemplo u16 x=65533;, dado que , um compilador tenha que considerar o valor dex*xcom nove anos, em vez de ter liberdade para fazer o que quiser), embora ainda nenhum dos meus emuladores tenha incluído isso [em parte porque os compiladores C ++ que eu usei não fizeram nada de maluco nesses casos].

Infelizmente, programadores em C e programadores em C ++ têm antipatia suficiente entre si, pois as linguagens, ao longo dos anos, evoluíram de maneiras compatíveis. Enquanto o C89 tentou adaptar alguns dos recursos mais úteis do C ++ (como protótipos de funções), parece ter surgido uma atitude de que programadores que desejam qualquer um dos recursos do C ++ devem usar o C ++, ignorando o fato de que existem muitas situações em que ser útil para poder usar alguns dos recursos do C ++ (por exemplo, a capacidade de sobrecarregar funções com ligação estática ou estática em linha sem ter que aceitar os custos associados a outros recursos que não são necessários (por exemplo, o nome associado à exportação) funções sobrecarregadas).

Embora a interseção de C89 e C ++ 98 seja uma linguagem viável, o superconjunto utilizável de versões posteriores do C com versões posteriores do C ++ provavelmente encolheu e não cresceu (graças a coisas como a Regra de Alias ​​Estrita) e as tendências favorecem um fissura crescente.


1
O que é "C ++ 95"? Um relatório técnico?
Ben Voigt

1
Se você deseja sobrecarregar suas funções internas, mas não atribuir nomes a nomes externos, você pode colocar o primeiro em anônimo namespacee declarar o último como extern "C", em seguida, use um compilador C ++.
5gon12eder

@BenVoigt: Mea culpa. Eu deveria ter procurado. A versão do C ++ anterior ao C99. Quando o C89 foi lançado, ele tentou tornar o C mais parecido com o C ++, mas o C99 adicionou um número razoável de recursos nos quais o C ++ definitivamente não estava interessado (por exemplo, matrizes de comprimento variável). Não programa muito em C ++, mas acho que mais alguns recursos de C ++ ajudariam C mais do que os recursos divergentes.
Supercat

@ 5gon12eder: Eu nunca tentei vincular o código C ++ em um projeto em C. É realmente tão simples quanto ter tudo estático / em linha extern "C"ou também existem outras complicações (por exemplo, inicialização de objeto estático, etc.)? Existe alguma maneira no C ++ de fazer com que foo(1234)ele invoque uma foo_const(1234)macro enquanto foo(x)[onde xnão é uma constante] invoque uma foo_var(x)função? Há muitas situações em código incorporado onde pode fazer sentido para uma "função" gostaria SET_PORT(port, state)de ter três formas com base em se a porta e estado são ambos ...
supercat

... constantes em tempo de compilação, port é constante, mas state não, ou onde nem port nem state são constantes. Existe alguma maneira de fazer isso de forma limpa usando modelos ou algum outro mecanismo C ++ padrão, ou isso só é possível em compiladores com extensões gcc?
Supercat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.