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:
- Devo parar de usar o termo C / C ++?
- Se a resposta para o número 1 for sim, como eu chamaria um programa que usa uma combinação de C e C ++?
- 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.)
- Existe agora alguma colaboração entre as pessoas que fazem os padrões de C / C ++ para manter a compatibilidade
- 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.
c++
c
terminology
c++11
rkachach
fonte
fonte
Should I stop using the term C/C++
. Sim. Isso é usado apenas por recrutadores e RH. Os engenheiros usarão o termoC
ouC++
como idiomas independentes. Se você encontrar um engenheiro que mistura o termo, evite-o.Respostas:
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.sim
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.
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.
Eu sempre sinto que vale a pena mencionar que C é um subconjunto de Objective-C.
fonte
javac
, mas qual seria o objetivo?C/Fortran/sh
faz sentido agora ?! ioccc.org/years-spoiler.html#1986 .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
fonte
C/C++
não é clara e, portanto, não é útil. Seguindo seus exemplos, aC/C++ library
poderia 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 é feitaC and C++
é muito mais claro, ouC 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 ...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.
fonte
or
, não como lógicoxor
. 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.Existem muitas diferenças sutis entre C e C ++. Por exemplo, em C ++, uma
const
variável no escopo global tem ligação interna, a menos que seja declaradaextern
, mas em C ela possui ligação externa, a menos que seja declaradastatic
. 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:
Sim.
Se você estiver vinculando os códigos C e C ++, é aceitável usar as duas tags, mas especifique em qual idioma cada arquivo está.
À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,
auto
em C ++ 11.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.
fonte
struct class
para algostruct klass
exatamente por esse motivo, e então é invariavelmente abatido por Linus.C nunca foi um subconjunto de C ++. Por exemplo, C89 não é um subconjunto do C ++ 98.
Alguns exemplos:
int
vsbool
)Sim.
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 ++.
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 ++.fonte
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:
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.
fonte
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 .
Se você está falando sobre algo em C ++ que pode ou não ser verdadeiro para C, basta dizer C ++ .
Se você quiser destacar uma semelhança entre C e C ++, diga C e C ++ .
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
não é certo nem errado.
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.
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.
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.
Como discutido acima, aconteceu no C ++ 11 e é esperado / esperado / necessário que ocorra novamente.
fonte
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 };
oufor(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.
fonte
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.
fonte
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 ++.
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.
fonte
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*x
com 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.
fonte
namespace
e declarar o último comoextern "C"
, em seguida, use um compilador C ++.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 quefoo(1234)
ele invoque umafoo_const(1234)
macro enquantofoo(x)
[ondex
não é uma constante] invoque umafoo_var(x)
função? Há muitas situações em código incorporado onde pode fazer sentido para uma "função" gostariaSET_PORT(port, state)
de ter três formas com base em se a porta e estado são ambos ...