Existe uma maneira de desativar apenas uma única linha de aviso em um arquivo cpp com o visual studio?
Por exemplo, se eu detectar uma exceção e não lidar com ela, recebo o erro 4101 (variável local não referenciada). Existe uma maneira de ignorar isso apenas nessa função, mas caso contrário, relatá-lo na unidade de compilação? No momento, eu coloquei #pragma warning (disable : 4101)
no topo do arquivo, mas obviamente apenas desativa a unidade inteira.
c++
visual-c++
warnings
pragma
Biscoito
fonte
fonte
catch (const std::exception& /* unnamed */) {.... }
. Não responde à sua pergunta, mas pode resolver o seu problema.Respostas:
fonte
clang
não parece apoiar este pragma, mas você pode conseguir o mesmo efeito com#pragma clang diagnostic push
,#pragma clang diagnostic ignored "-Wunused-variable"
e#pragma clang diagnostic pop
. Consulte "Controlando diagnósticos por meio de pragmas" no Manual do usuário do Clang/wd4101
. Observe que não há normal:
entre a bandeira e o número, e você não pode fazer uma lista de números separados por vírgulas. Para outros compiladores, pode ser/nowarn:4101
.Se você deseja suprimir um aviso em uma única linha de código, pode usar o
suppress
especificador de aviso :Para uma única linha de código, isso funciona da mesma forma que escrever o seguinte:
fonte
suppress
especificador opera em uma única linha de código pré-processada . Se a linha a seguir#pragma warning(suppress: ...)
for uma#include
diretiva (que expande o arquivo referenciado por seu parâmetro na unidade de compilação atual), o efeito se aplica apenas à primeira linha desse arquivo. Isso deve ser óbvio, uma vez que os avisos são gerados pelo compilador. O compilador opera em código pré-processado.#pragma
push / pop costuma ser uma solução para esse tipo de problema, mas, neste caso, por que você simplesmente não remove a variável não referenciada?fonte
:P
).Use
#pragma warning ( push )
, então#pragma warning ( disable )
, coloque seu código e use#pragma warning ( pop )
conforme descrito aqui :fonte
Exemplo:
Este pragma é válido para C ++ começando com Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
O pragma NÃO é válido para C # até Visual Studio 2005 até Visual Studio 2015.
Erro: "Desativação ou restauração esperada".
(Acho que eles nunca implementaram
suppress
...)https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx
C # precisa de um formato diferente. Ficaria assim (mas não funcionaria):
Em vez de
suppress
, você devedisable
eenable
:Isso é TÃO feio, acho que é mais inteligente apenas reformulá-lo:
fonte
Em vez de colocá-lo em cima do arquivo (ou mesmo de um arquivo de cabeçalho), apenas envolva o código em questão com
#pragma warning (push)
,#pragma warning (disable)
e uma correspondência#pragma warning (pop)
, conforme mostrado aqui .Embora existam algumas outras opções, incluindo
#pramga warning (once)
.fonte
Também se pode usar
UNREFERENCED_PARAMETER
definido emWinNT.H
. A definição é apenas:E use-o como:
Por que você o usaria, você pode argumentar que pode simplesmente omitir o próprio nome da variável. Bem, há casos (configuração de projeto diferente, compilações de depuração / liberação) onde a variável pode realmente ser usada. Em outra configuração, essa variável permanece sem uso (e, portanto, o aviso).
Algumas análises de código estático ainda podem dar um aviso para esta declaração sem sentido (
wParam;
). Nesse caso, você pode usar oDBG_UNREFERENCED_PARAMETER
que é o mesmo queUNREFERENCED_PARAMETER
em compilações de depuração e fazP=P
na compilação de lançamento.fonte
[[maybe_unused]]
attributeSe você deseja desativar a
unreferenced local variable
escrita em algum cabeçalhoE use
fonte
(void)unusedVar;
:?(void)unusedVar;?
não é compatível com o padrão C ++.static_cast<void>(unusedVar)
.Any expression can be explicitly converted to type “cv void.” The expression value is discarded
acordo com o qual você pode escreverstatic_cast<void>(unusedVar)
estatic_cast<const void>(unusedVar)
estatic_cast<volatile void>(unusedVar)
. Todos os formulários são válidos. Espero que esclareça sua dúvida.Em certas situações, você deve ter um parâmetro nomeado, mas não o usa diretamente.
Por exemplo, eu encontrei isso no VS2010, quando 'e' é usado apenas dentro de uma
decltype
instrução, o compilador reclama, mas você deve ter a variável nomeadae
.Todas as não
#pragma
sugestões acima se resumem a apenas adicionar uma única declaração:fonte
como @rampion mencionou, se você estiver no clang gcc, os avisos são por nome, não por número, e você precisará fazer:
esta informação vem daqui
fonte