- 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 main
funçã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 namespace
s. Por outro lado, C permite chamar main
recursivamente enquanto C ++ não. No C ++, há um implícito return 0;
se você "cair", main
mas no C a return
instruçã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 int
s 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, calloc
seria 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 sizeof
an 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.
- 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.
- 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.
- 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.
- 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.