Eu tenho um aplicativo de plataforma cruzada e em algumas de minhas funções nem todos os valores passados para as funções são utilizados. Por isso, recebo um aviso do GCC informando que existem variáveis não utilizadas.
Qual seria a melhor maneira de codificar o aviso?
Um #ifdef em torno da função?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Isso é tão feio, mas parece da maneira que o compilador prefere.
Ou atribuo zero à variável no final da função? (que eu odeio porque está alterando algo no fluxo do programa para silenciar um aviso do compilador).
Existe uma maneira correta?
c++
gcc
warnings
gcc-warning
Phil Hannent
fonte
fonte
Q_UNUSED
macro apenas para isso. Confira na documentação.Respostas:
Você pode colocá-lo na
(void)var;
expressão " " (não faz nada) para que um compilador veja que ele é usado. Isso é portátil entre compiladores.Por exemplo
Ou,
fonte
Q_UNUSED
é implementado em princípio.#define UNUSED(expr) (void)(expr)
deve funcionar também (sem o tempo de espera).template<typename... Args> void f(const Args&... args)
Eu não posso escrever(void)args;
ou(void)args...;
porque ambos são erros de sintaxe.No GCC e no Clang, você pode usar a
__attribute__((unused))
diretiva de pré - processador para atingir seu objetivo.Por exemplo:
fonte
C ++ 17 agora fornece o
[[maybe_unused]]
atributohttp://en.cppreference.com/w/cpp/language/attributes
Bastante agradável e padrão.
fonte
Sua solução atual é a melhor - comente o nome do parâmetro se você não o usar. Isso se aplica a todos os compiladores, portanto você não precisa usar o pré-processador para fazê-lo especialmente no GCC.
fonte
g++
aviso está sendo feito). Nesse caso, o que você recomendaria?Atualização C ++ 17
No C ++ 17, obtemos o atributo [[maybe_unused]], coberto em [dcl.attr.unused]
Para o seguinte exemplo:
Clang e gcc geram um diagnóstico usando -Wall -Wextra para bar e unused_bool ( Veja ao vivo ).
Ao adicionar [[maybe_unused]] silencia o diagnóstico:
veja ao vivo .
Antes do C ++ 17
No C ++ 11, uma forma alternativa da
UNUSED
macro pode ser formada usando uma expressão lambda ( via Ben Deane ) com uma captura da variável não utilizada:A chamada imediata da expressão lambda deve ser otimizada, dado o seguinte exemplo:
podemos ver em godbolt que a chamada está otimizada:
fonte
template <class T> inline void NOTUSED( T const & result ) { static_cast<void>(result); }
Você também pode usar um lambda na função, suponho.[&x]{}()
realmente não silencia o aviso, mas passa o aviso da função de chamada para o lambda. Vai levar tempo até que os compiladores identifiquem isso como um aviso, mas o clang-tidy já reclama de uma variável não utilizada na lista de capturas.Uma maneira ainda mais limpa é apenas comentar os nomes das variáveis:
fonte
#if 0 / #endif
comentários em bloco.Um colega de trabalho acabou de me apontar para esta bela macro aqui
Para facilitar, incluirei a macro abaixo.
fonte
gccnão sinaliza esses avisos por padrão. Esse aviso deve ter sido ativado explicitamente passando
-Wunused-parameter
para o compilador ou implicitamente passando-Wall -Wextra
(ou possivelmente alguma outra combinação de sinalizadores).Os avisos de parâmetro não utilizados podem ser simplesmente suprimidos, passando
-Wno-unused-parameter
para o compilador, mas observe que esse sinalizador de desativação deve vir após qualquer sinalizador de ativação possível para esse aviso na linha de comando do compilador, para que ele entre em vigor.fonte
maneira sem macro e portátil de declarar um ou mais parâmetros como não utilizados:
fonte
O uso de diretivas de pré-processador é considerado ruim na maioria das vezes. Idealmente, você deseja evitá-los como a praga. Lembre-se de que é fácil fazer o compilador entender seu código, permitindo que outros programadores entendam seu código muito mais difícil. Algumas dezenas de casos como esse aqui e ali dificultam a leitura para você mais tarde ou para outras pessoas agora.
Uma maneira pode ser reunir seus parâmetros em algum tipo de classe de argumento. Você poderia usar apenas um subconjunto das variáveis (equivalente a atribuir 0 realmente) ou ter diferentes especializações dessa classe de argumentos para cada plataforma. No entanto, isso pode não valer a pena, você precisa analisar se isso se encaixaria.
Se você conseguir ler modelos impossíveis, poderá encontrar dicas avançadas no livro "Excepcional C ++". Se as pessoas que leram o seu código pudessem incluir suas habilidades abrangendo as coisas loucas ensinadas nesse livro, você teria um código bonito que também pode ser facilmente lido. O compilador também estaria bem ciente do que você está fazendo (em vez de ocultar tudo com o pré-processamento)
fonte
#define UNUSED(expr) (void)(expr)
apropriado.Primeiro, o aviso é gerado pela definição de variável no arquivo de origem e não no arquivo de cabeçalho. O cabeçalho pode permanecer intocado e deve, pois você pode estar usando algo como doxygen para gerar a documentação da API.
Assumirei que você tenha uma implementação completamente diferente nos arquivos de origem. Nesses casos, você pode comentar o parâmetro incorreto ou apenas escrever o parâmetro.
Exemplo:
Isso pode parecer enigmático, então definiu uma macro como NÃO UTILIZADA. A maneira como o MFC fez isso é:
Assim você vê o aviso ainda nas compilações de depuração, pode ser útil.
fonte
Não é seguro comentar sempre os nomes dos parâmetros? Se não for, você pode fazer algo como
É um pouco menos feio.
fonte
Eu vi isso em vez da
(void)param2
maneira de silenciar o aviso:Parece que isso foi adicionado no C ++ 11
fonte
Usando um
UNREFERENCED_PARAMETER(p)
poderia funcionar. Eu sei que ele está definido no WinNT.h para sistemas Windows e também pode ser facilmente definido para o gcc (se ainda não o tiver).UNREFERENCED PARAMETER(p)
é definido comono WinNT.h.
fonte
Use a bandeira do compilador, por exemplo, bandeira para o GCC:
-Wno-unused-variable
fonte
Você pode usar
__unused
para informar ao compilador que a variável não pode ser usada.fonte
__unused
não é C ++ padrão, e mais ao ponto, nem o que você postou ... Isso é Objective-C. Portanto, essa resposta é realmente útil apenas para compilador (es) específico (s), e torna o código não portátil e, na verdade, não é válido, pois o código do usuário não se destina a usar identificadores iniciados por__
, reservados para a implementação.No C ++ 11, esta é a solução que estou usando:
Verificado como portátil (pelo menos no msvc moderno, clang e gcc) e não produzindo código extra quando as otimizações estão ativadas. Sem otimização, a chamada de função extra é executada e as referências aos parâmetros são copiadas para a pilha, mas não há macros envolvidas.
Se o código extra for um problema, você poderá usar esta declaração:
mas, nesse ponto, uma macro fornece melhor legibilidade:
fonte
Isso funciona bem, mas requer C ++ 11
fonte
ALLCAPS
de qualquer coisa, exceto macros, que é para torná-las feias e indesejáveis, mas não há nada de ruim nisso, na verdade, exceto que umstatic_cast
seria melhor.Descobri que a maioria das respostas apresentadas funciona apenas para variáveis locais não utilizadas e causará erro de compilação para variável global estática não utilizada.
Outra macro necessária para suprimir o aviso de variável global estática não utilizada.
Isso funciona porque nenhum aviso será relatado para variável global não estática no espaço para nome anônimo.
C ++ 11 é necessário
fonte
Ri muito! Eu não acho que exista outra pergunta sobre SO que revele todos os hereges corrompidos pelo Caos melhor que este!
Com todo o respeito ao C ++ 17, há uma diretriz clara nas Diretrizes Principais do C ++ . AFAIR, em 2009 essa opção estava disponível também hoje. E se alguém diz que é considerado um bug no Doxygen, existe um bug no Doxygen
fonte
Não vejo seu problema com o aviso. Documente no cabeçalho do método / função que o compilador xy emitirá um aviso (correto) aqui, mas que essas variáveis são necessárias para a plataforma z.
O aviso está correto, não há necessidade de desligá-lo. Ele não invalida o programa - mas deve ser documentado, que existe um motivo.
fonte