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

141

Eu entendo 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 bem verdade até o aparecimento de C ++ x0, C ++ 11 (ou o moderno C ++ 11/14/17 em geral). Na verdade (especialmente quando se trabalha com sistemas embarcados) é muito provável encontrar 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 a # 1 for sim, como eu chamaria um programa que usa uma combinação de C e C ++?
  3. Dado que ambos são linguagens 'diferentes' é provável que em algum momento os compiladores de C ++ parem de suportar código escrito na linguagem C (já que o c ++ moderno está divergindo da mentalidade C para coisas básicas como ponteiros, manipulação de memória dinâmica, etc)
  4. Existe agora qualquer colaboração entre as pessoas que fazem os padrões de C / C ++ para manter a compatibilidade
  5. Se # 4 for sim, essa colaboração pode acabar em um futuro próximo com a aparência do c ++ moderno (11/14/17)

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

    
por rkachach 30.09.2015 / 21:27
fonte

11 respostas

184

C nunca foi um subconjunto de C ++. O exemplo mais óbvio disso é int new; . Isto tem sido verdade desde C89 e C ++ 98, e as linguagens só cresceram mais umas nas outras à medida que novos padrões surgiram.

Should I stop using the term C/C++

Sim

If the answer to #1 is yes, how would I call a program that use a mix of C and C++?

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

Given that both of them are 'different' languages is it likely that at some point C++ compilers stop supporting code written in the C language

3) Eles nunca fizeram. %código%. C e C ++ nunca foram totalmente compatíveis pelo menos desde que tenham padrões ISO (não sei todos os detalhes sobre os dias pré-padronizados). clique nos links ou veja abaixo um arquivo que está bem com C89 e acima, mas não é válido sob nenhum padrão C ++.

4) afaik 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 mesmos.

/* 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 do Objective-C.

    
por 30.09.2015 / 21:32
fonte
108

Existe motivo pelo qual esses termos se juntam com tanta frequência. Embora você não deva dizer ao seu professor de C que sua linguagem é um subconjunto do 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ós não vivemos em uma torre de marfim ou em um livro.

Seu chefe não poderia se importar menos com o idioma exato que você usou. Se ele sabe um pouco sobre programação, diga a ele que você usou C / C ++ e soará como "usei uma linguagem que precisa ser compilada em código de máquina, com DLLs e todas as coisas complicadas". Esta é a parte da "comunicação externa".

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

Se você criar um analisador léxico para C ++, ficaria surpreso em saber como ele funciona com C. Você pode até não precisar modificar tudo. Este é o "se parece um pato, etc." parte.

Etc.

A maioria dos programas em C que eu já vi compilar (e funcionar) sem modificação como código C ++. Não deixe que algumas exceções ou programadores dogmáticos (mesmo que influentes) enganem sua intuição. C e C ++ são tão próximos, e tão frequentemente compatíveis, e tão frequentemente misturados e combinados, que o termo C / C ++ é usado. Ele é 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á se for mais pedante do que o necessário e se recusar a se comunicar em termos que os outros entendam. Se você se sentir desconfortável em alguma situação específica, simplesmente não use o termo genérico C / C ++, mas o que for relevante para o caso (C ou C ++).

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

Para ser específico sobre seus pontos:

1) Depende. Sim, quando isso poderia levar a uma confusão, quando você se sentir desconfortável, ou quando estiver simplesmente errado ou fora de contexto. Não quando você acha que é adequado.

2) N / A

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

4) sem ideia

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

    
por 01.10.2015 / 01:03
fonte
42

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

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

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

  • Existem várias bibliotecas que geralmente possuem APIs C e C ++. Eu acho que não está longe de ser verdade se você chamar tal coisa de uma biblioteca C / C ++. Nós humanos gostamos de comprimir informação, então dizer "opencv é uma biblioteca C / C ++" é curto, claro e compreensível, e compare com "opencv é uma biblioteca, que é 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 tem a mesma sintaxe do 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 em desenvolvimento embarcado, 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 ++.
por 01.10.2015 / 08:15
fonte
30

In general the SO users ask the person who is asking the question to choose a language: C or C++. Why?

Existem muitas diferenças sutis entre C e C ++. Por exemplo, em C ++, uma variável const 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 à sua pergunta é a mesma em C e C ++, quando muito bem pode não ser. Isso desnecessariamente torna as coisas mais difíceis para possíveis respondentes.

  • Às vezes, podemos identificar que o código não é válido em um idioma ou em outro (por exemplo, conversões implícitas de void* para ponteiro para objeto não são válidas em C ++). Isso é chato. Por que você está dizendo "C / C ++" quando você tem um pedaço de código que é 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 comprimento variável existem no C99, mas não no C ++). Se não sabemos de qual língua você está falando, temos que adivinhar ou escrever uma resposta para ambos quando apenas um realmente será útil, porque você sabe qual idioma está realmente usando; você simplesmente não está nos dizendo!

  • Às vezes, a resposta é 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 absoluta, preciso ler os dois padrões cuidadosamente. Novamente, isso me faz fazer o dobro do trabalho necessário quando você provavelmente se importa apenas com uma das linguagens.

De qualquer forma, para responder às suas outras perguntas:

  1. Sim.

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

  3. Ocasionalmente, há algumas alterações, mas elas são raras e normalmente limitadas no impacto (caso contrário, elas não são aprovadas). Por exemplo, auto em C ++ 11.

  4. Eu não acho que eles colaboram diretamente, mas eles prestam atenção aos desenvolvimentos no outro idioma e tentam evitar a introdução de alterações que tornariam a compatibilidade mais difícil.

E se você realmente quer saber sobre os dois idiomas, tudo bem, e você pode dizer isso na sua pergunta. Quando você diz "C / C ++", eu realmente não tenho certeza do que você quer dizer, e realmente parece que você está fazendo uma suposição sobre os dois idiomas.

    
por 30.09.2015 / 22:53
fonte
18

I was always told that C is a subset of C++ or C++ is C with classes. And that was quiet true until the appearance of C++x0, C++11 (or the modern C++ 11/14/17 in general).

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

Alguns exemplos:

  • o para declaração de parâmetro de função não é suportado em C ++
  • C89 e C ++ 98 possuem tipos diferentes para as constantes de caracteres
  • C89 e C ++ 98 possuem tipos diferentes para literais de string
  • operadores lógicos produzem tipos diferentes em C89 e C ++ 98 ( int vs bool )
  1. Should I stop using the term C/C++?

Sim.

  1. If the answer to #1 is yes, how would I call a program that use a mix of C and C++?

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

EDIT : No entanto, admito que, tecnicamente, é possível vincular arquivos de objetos C e C ++ em um único programa, mas há muitas linguagens que podem ser misturadas em um único programa, por exemplo, Java e C ++. . Eu acho que usar o termo C / C ++ apenas aumenta a confusão de que está escrito em uma única linguagem chamada C / C ++.

  1. Given that both of them are 'different' languages is it likely that at some point C++ compilers stop supporting code written in the C language (since modern c++ is diverging from the C mentality for basic stuff like pointers, dynamic memory handling, etc)

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

    
por 30.09.2015 / 21:32
fonte
16

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

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

Mas isso é apenas o programa como um todo. E quanto às unidades de compilação individuais?

Existe 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, em conformidade com os compiladores C e C ++. Tal programa ou arquivo pode corretamente ser chamado de "um programa C / C ++" ou "um arquivo C / C ++".

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

Citando o professor Bjarne Stroustrup:

Is C a subset of C++?

In the strict mathematical sense, C isn't a subset of C++. There are programs that are valid C but not valid C++ and even a few ways of writing code that has a different meaning in C and C++. However, C++ supports every programming technique supported by C. Every C program can be written in essentially the same way in C++ with the same run-time and space efficiency. It is not uncommon to be able to convert tens of thousands of lines of ANSI C to C-style C++ in a few hours. Thus, C++ is as much a superset of ANSI C as ANSI C is a superset of K&R C and much as ISO C++ is a superset of C++ as it existed in 1985.

Well written C tends to be legal C++ also. For example, every example in Kernighan & Ritchie: "The C Programming Language (2nd Edition)" is also a C++ program.

Então yes existe algo como C / C ++. É qualquer coisa que seja válida para C e C ++ válido.

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

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

Se o programa é 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 C pode fazer pelo menos um pouco de C ++ e vice-versa

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

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

A língua inglesa não é uma ferramenta para expressar silogismos . Você pode usar o inglês para lógica, mas apenas com muito esforço.

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

    
por 01.10.2015 / 12:07
fonte
15
  1. Should I stop using the term C/C++?

Absolutamente. Não está claro o que este construto 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 tão comum de frustração, muitas pessoas se tornaram bastante emotivas e a aparência desse termo por si só será razão suficiente para que se tornem negativas sobre sua contribuição. Isso pode parecer bobo, mas parece ser o que temos.

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

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

    Example: How should the main function be declared in C?

    At first, it might seem that the answer for C++ is the same: int main() or int main(int, char**). But as the discussion goes on, it might be relevant to point out that in C++, the function has to be declared at global scope, which doesn't make sense in C, because it has no namespaces. On the other hand, C allows calling main recursively while C++ doesn't. In C++, there is an implicit return 0; if you “fall off” main but in C the return statement is required on any path. The list goes on and it makes the discussion much simpler if you make it clear up front what the language to be discussed is.

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

    Example: Will a malloc()ed array of ints initially be all-zeros in C++?

    The short answer for C happens to be the same: no. But as the answer goes on, it might be worthwhile to point out that in C, calloc would be a good alternative while in C++, using a std::vector<int> might have been a better choice in the first place.

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

    Example: In C and C++, the sizeof an int is implementation defined and may vary between compilers and architectures.

    Here, we want to point out that C and C++ behave the same way. We are explicitly talking about both languages.

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 linguagens estão evoluindo e uma declaração direta como

C++ supports /* … */ and // … comments while C only supports the /* … */ style.

não é certo nem errado.

  1. If the answer to #1 is yes, how would I call a program that use a mix of C and 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 optado por usar um compilador C ou C ++. Então diga “o programa está escrito em C ” se ele é compilado com um compilador C e “o programa é escrito em C ++ ” se eles usarem um compilador C ++, mesmo se eles podem se recusar a usar quaisquer recursos modernos do C ++. Algumas pessoas se referem a esse código C ++ como C-style C ++ . Ausência de sobrecarga, exceções, polimorfismo, modelos e fluxos de E / S características comuns de tal código.

Se, ao invés disso, alguns arquivos são escritos em C e compilados com um compilador C e alguns arquivos outros são escritos em C ++ e compilados com um compilador C ++, e então os arquivos objeto são unidos, eu diria que "o programa está escrito em uma mistura de C e C ++ " como, de fato, você já fez.

No entanto, se, em vez disso, os autores tomarem muito cuidado para escrever cada arquivo de tal forma que ele possa ser compilado com um compilador C ou um C ++ e o programa resultante faria o mesma coisa, você poderia dizer que “o programa está escrito em um subconjunto comum de C e C ++ ”.

O último é frequentemente o caso de arquivos de cabeçalho que devem ser compartilhados entre o código C e C ++. Escrever tal código não é fácil, a propósito. Se você quiser enfatizar ainda mais que apenas tais construções foram usadas que são válidas em C e C ++ e são amplamente suportadas por diferentes fornecedores de compiladores, o termo a portátil comum subconjunto de C e C ++ pode ser usado para enfatizar isso.

  1. Given that both of them are “different” languages is it likely that at some point C++ compilers stop supporting code written in the C language (since modern C++ is diverging from the C mentality for basic stuff like pointers, dynamic memory handling, etc)?

Não sei se entendi essa pergunta. Como C e C ++ são idiomas diferentes, você não pode esperar que um compilador aceite um programa escrito para o outro. No entanto, os compiladores geralmente são criados de maneira modular e, se um compilador tiver um front end em C ++ , as chances são boas de que ele também tenha um front-end em C. (Você selecionaria qual delas deseja por meio de uma linha de comando ou meios semelhantes.) Desde que os dois idiomas sejam amplamente utilizados, parece muito improvável que isso mude. Seu ponto sobre o "moderno C ++" eu 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 linguagens é bastante convergente do que divergente.

  1. Is there right now any collaboration between the people who make the standards of C/C++ to keep the compatibility?

Sim. O modelo de memória e a biblioteca de operações atômicas introduzida no C ++ 11 e C11 é um bom exemplo. Parece que os designers de ambas as linguagens percebem que a compatibilidade é importante e estão trabalhando para melhorá-la. Pessoalmente, eu gostaria que a colaboração fosse mais intensa e os dois grupos de trabalho da ISO talvez até 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 ++ em § 44.3 da 4ª edição de A Linguagem de Programação C ++ que, ironicamente, se chama “Compatibilidade C / C ++” . O uso do termo pode realmente ser apropriado neste caso, pois é claro o que se entende.

  1. If #4 is yes, such collaboration could end up in the near future with the appearance of the modern C++ (11/14/17)

Como discutido acima, aconteceu em C ++ 11 e é esperado / esperado / precisava acontecer novamente.

    
por 01.10.2015 / 01:24
fonte
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, em que nem 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) sob C ++ 11 e C ++ 14, mesmo que compilar em um não implica que ele compila sob o outro. Na verdade, muita gente faz isso.

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

Obviamente, quanto maior a sobreposição, mais sentido ela faz; Eu 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 main () retornar em C e C ++?

Mas você pode falar sobre o código que funciona para especificações de vários idiomas, independentemente de essas especificações serem diferenciadas por "versão" ou "nome do idioma" ou de outra forma.

    
por 01.10.2015 / 18:30
fonte
3

Esta é uma espécie de resposta à posição de que "este é um código para programadores que trabalham perto do metal e está OK 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, teria que perguntar quanto eles sabem sobre design orientado a objetos, quanta experiência eles têm com depuração. em um contexto orientado a objetos e sobre sua capacidade de usar bibliotecas de modelos. Você gostaria de investigar exatamente esses problemas durante a entrevista e o processo de contratação.

Por outro lado, faz mais de uma década que os gurus de C ++ começaram a usar o "C ++ moderno", o que significa uma ênfase em se afastar de ponteiros simples para objetos de ponteiro mais seguros e idiomas baseados em iteradores. Com o surgimento do C ++ 11, agora há suporte explícito para a programação multiparadigmática, e o impulso para o código que não exibe indicadores nítidos é muito strong. O que isso significa é que, se eu entrevistei um programador C ++ para uma posição C hoje, eu ficaria muito preocupado em verificar o quão familiar essa pessoa era com ponteiros reais, habilitados para fotografar com pé.

Eu não estou no negócio hoje em dia (mesmo na medida em que eu estava quando o Stack Overflow estava em sua infância), então não vou arriscar um palpite sobre a frequência com que um entrevistado imaginário não teria o cross-over habilidades, mas eu acho que, como na maioria das vezes aplicadas, as linguagens são agora muito diferentes.

Em suma, "C / C ++" deve ser descartado não apenas em contextos técnicos, mas também na maioria dos contextos de negócios.

    
por 04.10.2015 / 23:06
fonte
2

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

And that was quiet true until the appearance of C++x0, C++11 (or the modern C++ 11/14/17 in general).

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

    
por 30.09.2015 / 23:44
fonte
1

Conceitualmente, não deve haver nenhuma dificuldade particular em projetar arquivos-fonte C para que eles também possam ser compilados como estão com o C ++. De fato, pode haver algumas vantagens significativas em fazer isso. Por exemplo, ao escrever código para um sistema embarcado, à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 embarcado (compilado como C), mas acionar a lógica de emulação no PC (compilando como C ++). Também seria possível projetar um tipo de C ++ no PC que se comportaria como um uint16_t se comporta em sistemas embarcados menores (então, por exemplo, dado o u16 x=65533; , um compilador teria que considerar o valor de x*x como nove, em vez de ter liberdade de ação para fazer o que quiser), embora nenhum dos meus emuladores tenha incluído isso [em parte porque os compiladores de C ++ que usei não fizeram nada maluco em tais casos].

Infelizmente, programadores C e programadores C ++ têm antipatia suficiente um com o outro que as linguagens, ao longo dos anos, evoluíram de maneiras compatíveis. Embora o C89 tenha tentado adaptar alguns dos recursos mais úteis do C ++ (como protótipos de função), parece ter surgido uma atitude de que os programadores que desejam algum dos recursos do C ++ devem usar C ++, ignorando o fato de que há muitas situações em que ele ser útil para poder usar alguns dos recursos do C ++ (por exemplo, a capacidade de sobrecarregar funções com enlace in-line estático ou estático sem ter que aceitar os custos associados a outros recursos que não são necessários ( por exemplo, o nome mangling associado à exportação de funções sobrecarregadas).

Enquanto a interseção de C89 e C ++ 98 é uma linguagem viável, o superconjunto utilizável de versões posteriores de C com versões posteriores de C ++ provavelmente diminuiu em vez de aumentar (graças a coisas como a Regra de Aliasmente Estrita) e as tendências favorecem uma fissura cada vez maior.

    
por 02.10.2015 / 01:27
fonte