Qual é a diferença entre o qualificador const em C e o qualificador const em C ++?

9

Eu encontrei um comentário do usuário R .. :

C e C ++ não são a mesma linguagem. Em particular, C constnão tem nada a ver com C ++ const.

Eu sei que uma diferença entre o constqualificador em C e o constqualificador em C ++ é a ligação padrão.

Um objeto declarado no escopo de espaço para nome com constqualificador em C ++ possui ligação interna, enquanto em C um objeto com constqualificador declarado em escopo global (sem ter um staticqualificador antes const) possui ligação externa.

Mas de que outra forma eles diferem entre as linguagens de C e C ++? Eu pensei que ambos têm o mesmo tipo de conceito e propósito nos dois idiomas.

Minha pergunta:

  • Qual é a diferença entre o qualificador const em C e o qualificador const em C ++?

As respostas para Como "const" difere em C e C ++? não aponte uma diferença exata entre os idiomas de C e C ++ no contexto do constqualificador. Somente o que você não pode fazer ou pode fazer com ele em um determinado idioma.

RobertS suporta Monica Cellio
fonte
Tantas respostas a apenas uma pesquisa do Google. Um deles: stackoverflow.com/questions/4486442/…
schaiba
11
Em C, constnão tem nada a ver com ligação. Você pode ter static constno escopo do arquivo e ele possui ligação interna,
Lundin
3
Se você não estiver satisfeito com as respostas atuais para essa pergunta, que é a mesma que a sua, considere postar uma recompensa.
Sneftel 07/02
3
Concordo que a duplicata vinculada está incorreta. Uma boa resposta listaria todas as diferenças e não explicaria muito o que constfaz o mesmo nos dois idiomas.
Lundin
11
Posso tentar escrever essa resposta, mas não sou um guru de C ++ suficiente para ter certeza de que tenho todas as diferenças cobertas. No topo da minha cabeça: variáveis ​​const em C ++ são expressões constantes, ao contrário de C. C ++ pode const qualificar funções-membro. A ligação mencionada. Algo mais?
Lundin

Respostas:

11
  • A diferença mais importante é que em C ++ uma constvariável é uma expressão constante (mesmo antes da introdução do C ++ 11 constexpr), mas uma constvariável em C não é.

    Significa que o C ++ permite que você faça coisas como const size_t n = 1; static int array[n];C, mas não por isso, supostamente por razões históricas.

  • Em C ++, constparticipa da determinação da ligação. Isso é diferente entre as versões C ++. De acordo com cppreference.com (ênfase minha):

    Qualquer um dos seguintes nomes declarados no escopo do espaço para nome tem ligação interna:


    • não-volátil não-modelo (desde C ++ 14) não em linha (desde C ++ 17) não exportou (desde C ++ 20) variáveis ​​constantes qualificadas (incluindo constexpr) que não são declaradas externas e não são ' t declarado anteriormente ter ligação externa;

    Enquanto em C, constnão desempenha nenhum papel na determinação da ligação - apenas o escopo da declaração e os especificadores da classe de armazenamento são importantes.

  • No C ++, você pode constqualificar funções de membro. Isso não é possível em C, pois não possui suporte de sintaxe para funções de membro.

  • C permite que constvariáveis ​​qualificadas sejam declaradas sem um inicializador. Em C, podemos escrever const int x;sem inicializadores, mas o C ++ não permite isso. À primeira vista, isso pode parecer um erro de linguagem sem sentido em C, mas a lógica é que os computadores possuem registros de hardware somente leitura com valores definidos pelo hardware, não pelo software. Significando que C permanece adequado para programação relacionada a hardware.

Lundin
fonte
Você pode ter funções de membro em C?
Maxim Egorushkin
11
Observe que const size_t n = 1; static int array[n];só funciona se o compilador puder ver a definição ne fazer propagação constante. extern const size_t n; static int array[n];não funciona
Maxim Egorushkin
Hum, eu prefiro ver esses registros de hardware sendo endereçados por ponteiros, como uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua
@Aconcagua Isso tornaria esses registros incompatíveis com o restante do mapa de registros. E como isso permitiria exibir os valores reais do registro em um depurador? Por exemplo, se você deseja apenas exibir os registros de conjunto de máscaras de silício somente leitura para ver rapidamente com que parte você terminou. E, obviamente, você também precisará volatilequalificar o ponteiro.
Lundin
@Lundin Admitido, não prestei atenção no volatile... O resto depende. Os depuradores que eu tinha à mão nesses casos também podiam resolver facilmente *x. Por outro lado, se os registradores são mapeados para alguma região da memória e o compilador não suporta a colocação de variáveis ​​diretamente em locais específicos da memória (eu vi os dois), obter a variável em um local específico da memória às vezes pode ficar um pouco confuso (ter que cobrir isso no arquivo de mapa ...). No final, não me importo muito em ter uma variável localizada no lugar certo ou em um ponteiro, desde que eu consiga executar a tarefa que me foi atribuída;)
Aconcagua
0

Em cppreference.com :

O constqualificador usado na declaração de uma variável não local não volátil não modelo (desde C ++ 14) não em linha (desde C ++ 17) que não é declarada externfornece a ligação interna. Isso é diferente de C, onde constas variáveis ​​do escopo do arquivo têm ligação externa.

Fora isso, consttem a mesma semântica nos cabeçalhos C e C ++ e C, constgeralmente são compilados como cabeçalhos C ++ com condicional "extern C".

Maxim Egorushkin
fonte
11
É uma citação ruim, simplificação excessiva. static const x;no escopo do arquivo em C tem ligação interna. A ligação de uma variável C é determinada pelo escopo em que é declarada, bem como pela presença / ausência de especificadores de classe de armazenamento. conste outros qualificadores de tipo não fazem parte disso.
Lundin
@Lundin Como isso é diferente do que a citação diz?
Maxim Egorushkin
11
O exemplo que acabei de dar prova que a citação está errada. De acordo com a citação, static const x;no escopo do arquivo em C tem ligação externa.
Lundin
@ Lundin A citação diz que int const x = 1em C tem ligação externa . Portanto, você precisará staticalterar a ligação para interno. A citação é bastante clara para mim, ao contrário dos seus comentários.
Maxim Egorushkin
11
Realmente não diz isso. Leia a citação. "... C onde variáveis ​​de escopo do arquivo const possuem ligação externa".
Lundin