int fn();
void whatever()
{
(void) fn();
}
Existe alguma razão para lançar um valor de retorno não utilizado para o vazio, ou estou certo em pensar que é uma completa perda de tempo?
Acompanhamento:
Bem, isso parece muito abrangente. Suponho que seja melhor do que comentar um valor de retorno não utilizado, uma vez que o código de autodocumentação é melhor do que comentários. Pessoalmente, desativarei esses avisos, pois é um ruído desnecessário.
Vou engolir minhas palavras se um bug escapar por causa disso ...
No trabalho, usamos isso para reconhecer que a função tem um valor de retorno, mas o desenvolvedor afirmou que é seguro ignorá-lo. Já que você marcou a questão como C ++, você deve usar static_cast :
Até onde o compilador vai lançar o valor de retorno para void tem pouco significado.
fonte
A verdadeira razão para fazer isso remonta a uma ferramenta usada no código C, chamada lint .
Ele analisa o código procurando possíveis problemas e emitindo avisos e sugestões. Se uma função retornasse um valor que não foi verificado,
lint
avisaria caso isso fosse acidental. Para silenciarlint
este aviso, você lançou a chamada para(void)
.fonte
Casting to
void
é usado para suprimir avisos do compilador para variáveis não usadas e valores de retorno ou expressões não salvos.The Standard (2003) diz em §5.2.9 / 4 diz,
Então você pode escrever:
Todos os formulários são válidos. Eu geralmente o torno mais curto como:
Também está bem.
fonte
Desde c ++ 17, temos o
[[maybe_unused]]
atributo que pode ser usado em vez dovoid
elenco.fonte
nodiscard
que pode ser de interesse: stackoverflow.com/a/61675726/895245 Também acho que você não pode aplicar[[maybe_unused]]
diretamente à chamada, ao que parece, apenas a uma variável fictícia que aceita o retorno da chamada? Se isso estiver correto, é um pouco instável.Cast para vazio não tem custo. São apenas informações para o compilador como tratá-lo.
fonte
(void)
custa-me tempo e energia e faz-me pensar se o autor sabia como funcionam as expressões.Pois a funcionalidade de seu programa de lançamento para anular não tem sentido. Eu também diria que você não deve usá-lo para sinalizar algo para a pessoa que está lendo o código, como sugerido na resposta de David. Se você deseja comunicar algo sobre suas intenções, é melhor usar um comentário. Adicionar um elenco como este só parecerá estranho e levantará questões sobre o possível motivo. Apenas minha opinião...
fonte
For the functionality of you program casting to void is meaningless
Para autodocumentação e o número de avisos durante a compilação, realmente não é.you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
O melhor comentário é nenhum comentário , quando o código se explica. E, novamente, mantém um compilador de aviso válido feliz no processo.Além disso, ao verificar se seu código está em conformidade com os padrões MISTA (ou outros), ferramentas automáticas como LDRA não permitirão que você chame uma função que tenha um tipo de retorno sem que ela retorne um valor, a menos que você converta explicitamente o valor retornado em (void)
fonte
C ++ 17
[[nodiscard]]
C ++ 17 padronizou o "valor de retorno do negócio ignorado" com um atributo.
Portanto, espero que as implementações compatíveis sempre avisem apenas quando
nodiscard
forem fornecidas e nunca avisem o contrário.Exemplo:
main.cpp
compilar:
resultado:
Todos os itens a seguir evitam o aviso:
Não consegui usar
maybe_unused
diretamente naf()
chamada:dá:
O
(void)
trabalho do elenco não parece ser obrigatório, mas é "encorajado" no padrão: Como posso descartar intencionalmente um valor de retorno [[nodiscard]]?Também como visto na mensagem de aviso, uma "solução" para o aviso é adicionar
-Wno-unused-result
:embora eu não recomende, é claro, ignorar avisos globalmente como este.
C ++ 20 também permite que você adicione uma razão para o
nodiscard
que no[[nodiscard("reason")]]
como mencionado em: https://en.cppreference.com/w/cpp/language/attributes/nodiscardwarn_unused_result
Atributo GCCAntes da padronização de
[[nodiscard]]
e para C antes de finalmente decidirem padronizar atributos, o GCC implementou exatamente a mesma funcionalidade comwarn_unused_result
:que dá:
Deve-se notar então que, uma vez que ANSI C não tem um padrão para isso, ANSI C não especifica quais funções de biblioteca padrão C têm o atributo ou não e, portanto, as implementações tomaram suas próprias decisões sobre o que deve ou não ser marcado com
warn_unuesd_result
, qual é por isso que, em geral, você teria que usar o(void)
elenco para ignorar retornos de quaisquer chamadas para funções de biblioteca padrão para evitar totalmente os avisos em qualquer implementação.Testado em GCC 9.2.1, Ubuntu 19.10.
fonte