Ao revisar meu código aqui,const
surgiu a questão do uso da palavra - chave. Entendo que é usado para implementar o comportamento somente leitura em variáveis.
Estou confuso sobre quais são as várias situações em que pode ser útil.
- Deve ser usado por uma questão de clareza nos protótipos de função?
- Deve ser usado como uma medida de segurança durante o desenvolvimento do código?
- Deve ser usado no escopo de várias funções para declarar constantes em tempo de execução?
- Deve ser usado?
Essas perguntas são apenas exemplos da confusão que estou enfrentando. A confusão geral é
- Quando deve ser a
const
palavra - chave usada na programação C? - Quais são os vários tipos de benefícios que podem ser obtidos usando essa palavra-chave em C?
- Existem contras no uso da
const
palavra-chave?
Foi apontado que esta questão pode ser muito ampla devido a todas essas questões nos detalhes da minha pergunta. Eu só queria esclarecer que essas perguntas são apenas para esclarecer a confusão sobre a questão principal.
Quando e com que finalidade a palavra-chave const deve ser usada em C para variáveis?
Também pode ser reformulado como
O uso adequado da
const
palavra-chave em C` com os prós e os contras da mesma.
c
readability
patterns-and-practices
const
Aseem Bansal
fonte
fonte
Specific issues with software development
. Eu estou sendo bem específico.specific issue
. O uso adequado daconst
palavra-chave em C` com os prós e os contras da mesma.Respostas:
Ao revisar o código, aplico as seguintes regras:
Sempre use
const
para parâmetros de função passados por referência onde a função não modifica (ou libera) os dados apontados.Sempre use
const
para constantes que, de outra forma, poderiam ser definidas usando um #define ou um enum. O compilador pode localizar os dados na memória somente leitura (ROM) como resultado (embora o vinculador seja frequentemente uma ferramenta melhor para essa finalidade em sistemas incorporados).Nunca use const em um protótipo de função para um parâmetro passado por valor . Não tem significado e, portanto, é apenas "ruído".
Onde apropriado, use
const volatile
em locais que não podem ser alterados pelo programa, mas que ainda podem mudar. Os registros de hardware são o caso de uso típico aqui, por exemplo, um registro de status que reflete um estado do dispositivo:Outros usos são opcionais. Por exemplo, os parâmetros para uma função na implementação da função podem ser marcados como const.
ou função retornam valores ou cálculos que são obtidos e nunca mudam:
Esses usos
const
apenas indicam que você não alterará a variável; eles não mudam como ou onde a variável é armazenada. Obviamente, o compilador pode descobrir que uma variável não é alterada, mas adicionandoconst
você permite que isso seja imposto. Isso pode ajudar o leitor e adicionar um pouco de segurança (embora, se suas funções forem grandes ou complicadas o suficiente para que isso faça uma grande diferença, você possa ter outros problemas). Editar - por exemplo. uma função densamente codificada de 200 linhas com loops aninhados e muitos nomes de variáveis longos ou semelhantes, sabendo que determinadas variáveis nunca mudam podem facilitar a compreensão significativa. Tais funções foram mal projetadas ou mantidas.Problemas com
const
. Você provavelmente ouvirá o termo "envenenamento const". Isso ocorre quando adicionarconst
um parâmetro de função faz com que 'constness' se propague.Edit - envenenamento const: por exemplo, na função:
se mudarmos
str
paraconst
, devemos garantir que issofuction_b
também leva aconst
. E assim por diante, sefunction_b
passastr
parafunction_c
etc. Como você pode imaginar, isso pode ser doloroso se propagar em muitos arquivos / módulos separados. Se ele se propagar para uma função que não pode ser alterada (por exemplo, uma biblioteca do sistema), uma conversão se torna necessária. Portanto, espalhar oconst
código existente talvez esteja causando problemas. No entanto, no novo código, é melhorconst
qualificar - se consistentemente, quando apropriado.O problema mais insidioso
const
é que ele não estava no idioma original. Como complemento, ele não se encaixa perfeitamente. Para começar, ele tem dois significados (como nas regras acima, significando "Não vou mudar isso" e "isso não pode ser modificado"). Mas mais do que isso, pode ser perigoso. Por exemplo, compile e execute esse código e (dependendo do compilador / opções) poderá travar ao executar:strchr
retorna umchar*
não aconst char*
. Como seu parâmetro de chamada,const
ele deve converter o parâmetro de chamada parachar*
. E, nesse caso, isso elimina a propriedade de armazenamento real somente leitura. Editar: - isso se aplica geralmente a vars na memória somente leitura. Por 'ROM', quero dizer não apenas a ROM física, mas qualquer memória protegida contra gravação, como acontece com a seção de código dos programas executados em um sistema operacional típico.Muitas funções padrão da biblioteca se comportam da mesma maneira, portanto, tenha cuidado: quando você tem constantes reais (ou seja, armazenadas na ROM), você deve ter muito cuidado para não perder a consistência.
fonte
const volatile
variável.const
variável é realmente somente leitura:const
diz "Isso não pode ser modificado". A,const volatile
por outro lado, diz "Isso não pode ser modificado, mas pode mudar". Vou adicionar uma menção aos voláteis na minha resposta.const
variável por um não-const
ponteiro" (uma pergunta comum sobre SO e todos os outros fóruns C !). No geral, eu gosto desta resposta:)const
declara dados somente leitura e visualizações somente leitura dos dados - a diferença é "isso não pode ser modificado" versus "você não pode modificar isso".Geralmente, em qualquer linguagem de programação é recomendado o uso
const
ou o modificador equivalente, poisfonte
Sim, é basicamente a resposta do TheLQ.
É uma medida de segurança para o programador, para que você não modifique uma variável e para não chamar funções que possam modificá-las. Em uma matriz ou estrutura, o especificador const indica que os valores de seu conteúdo não serão modificados, e mesmo o compilador não permitirá que você faça isso. No entanto, você ainda pode alterar facilmente o valor da variável com apenas uma conversão.
No que geralmente vejo, é usado principalmente para adicionar valores constantes no código e para indicar que a matriz ou estrutura não será modificada se você chamar uma função específica. Esta última parte é importante, porque quando você chama uma função que modificará sua matriz ou estrutura, convém manter a versão original, para criar uma cópia da variável e depois passá-la para a função. Se não for esse o caso, você não precisará da cópia, obviamente, portanto, por exemplo, você pode alterar,
para
e não ficando a cópia em cima.
Apenas para adicionar, observe que C possui regras específicas com o especificador const. Por exemplo,
não é o mesmo que
O primeiro código não permitirá que você modifique a. No segundo caso, o ponteiro é constante, mas seu conteúdo não, portanto, o compilador permitirá que você diga
* a = 3;
sem um erro do compilador, mas não é possível fazera
referência a outra coisa.fonte
De acordo com as declarações da TheLQ:
Ao trabalhar com uma equipe de programadores, declarar
const
é uma boa maneira de indicar que a variável em questão não deve ser modificada ou apenas para se lembrar de grandes projetos. É útil nesse sentido e pode salvar muitas dores de cabeça.fonte