Eu encontrei um comentário do usuário R .. :
C e C ++ não são a mesma linguagem. Em particular, C
const
não tem nada a ver com C ++const
.
Eu sei que uma diferença entre o const
qualificador em C e o const
qualificador em C ++ é a ligação padrão.
Um objeto declarado no escopo de espaço para nome com const
qualificador em C ++ possui ligação interna, enquanto em C um objeto com const
qualificador declarado em escopo global (sem ter um static
qualificador 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 const
qualificador. Somente o que você não pode fazer ou pode fazer com ele em um determinado idioma.
fonte
const
não tem nada a ver com ligação. Você pode terstatic const
no escopo do arquivo e ele possui ligação interna,const
faz o mesmo nos dois idiomas.Respostas:
A diferença mais importante é que em C ++ uma
const
variável é uma expressão constante (mesmo antes da introdução do C ++ 11constexpr
), mas umaconst
variá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 ++,
const
participa da determinação da ligação. Isso é diferente entre as versões C ++. De acordo com cppreference.com (ênfase minha):Enquanto em C,
const
nã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
const
qualificar 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
const
variáveis qualificadas sejam declaradas sem um inicializador. Em C, podemos escreverconst 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.fonte
const size_t n = 1; static int array[n];
só funciona se o compilador puder ver a definiçãon
e fazer propagação constante.extern const size_t n; static int array[n];
não funcionauint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);
...volatile
qualificar o ponteiro.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;)Em cppreference.com :
Fora isso,
const
tem a mesma semântica nos cabeçalhos C e C ++ e C,const
geralmente são compilados como cabeçalhos C ++ com condicional"extern C"
.fonte
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.const
e outros qualificadores de tipo não fazem parte disso.static const x;
no escopo do arquivo em C tem ligação externa.int const x = 1
em C tem ligação externa . Portanto, você precisarástatic
alterar a ligação para interno. A citação é bastante clara para mim, ao contrário dos seus comentários.