Por exemplo:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
Em C ++, pude colocar um /*...*/
comentário em torno dos parâmetros. Mas não em C, é claro, onde isso me dá o erro error: parameter name omitted
.
c
gcc
gcc-warning
nixgadget
fonte
fonte
-Wno-unused-parameter
, é muito barulhento e raramente pega bugs esp. quando-Wshadow
é usado.Respostas:
Eu costumo escrever uma macro como esta:
Você pode usar essa macro para todos os seus parâmetros não utilizados. (Observe que isso funciona em qualquer compilador.)
Por exemplo:
fonte
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
que me permite aplicar isso a várias variáveis.Em gcc, você pode rotular o parâmetro com o
unused
atributo .Na prática, isso é realizado colocando um
__attribute__ ((unused))
pouco antes do parâmetro. Por exemplo:torna-se
fonte
__attribute__ ((unused))
na frente do argumento.__attribute__((unused))
é uma extensão proprietária do GCC . É suportado por outros compiladores, mas presumo que isso não funcione com o MSVC. Porém, não faz parte diretamente do padrão do compilador, portanto, não é tão portátil quanto algumas outras opçõesVocê pode usar o atributo não utilizado do gcc / clang, no entanto, eu uso essas macros em um cabeçalho para evitar atributos específicos do gcc em toda a fonte, além de ter em
__attribute__
todos os lugares um pouco detalhado / feio.Então você pode fazer ...
Prefiro isso porque você recebe um erro se tentar usar
bar
o código em qualquer lugar, para não deixar o atributo por engano.e para funções ...
Nota 1):
Até onde eu sei, o MSVC não tem um equivalente a
__attribute__((__unused__))
.Nota 2):
a
UNUSED
macro não funcionará para argumentos que contenham parênteses;portanto , se você tiver um argumento como
float (*coords)[3]
não pode ,float UNUSED((*coords)[3])
oufloat (*UNUSED(coords))[3]
, essa é a única desvantagem doUNUSED
macro que encontrei até agora, nesses casos, recuo para(void)coords;
fonte
#define __attribute__(x)
para ambientes não pertencentes ao GCC (nenhum dos AFAIK__attribute__
é suportado pelo MSVC)?warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)Com o gcc com o atributo não utilizado:
fonte
Vendo que isso está marcado como gcc, você pode usar a opção de linha de comando
Wno-unused-parameter
.Por exemplo:
É claro que isso afeta o arquivo inteiro (e talvez o projeto dependa de onde você configurou a opção), mas você não precisa alterar nenhum código.
fonte
Uma maneira específica de gcc / g ++ de suprimir o aviso de parâmetro não utilizado para um bloco de código-fonte é anexá-lo às seguintes instruções pragma:
fonte
Rotular o atributo é a maneira ideal. O MACRO gera confusão em algum momento. e usando void (x), estamos adicionando uma sobrecarga no processamento.
Se não estiver usando o argumento de entrada, use
Se não estiver usando a variável definida dentro da função
Agora, mais tarde, usando a variável hash para sua lógica, mas não precisa de bkt. defina bkt como não utilizado, caso contrário, o compilador diz 'bkt set bt não usado ".
NOTA: Isso é apenas para suprimir o aviso, não para otimização.
fonte
void(x)
, o compilador a otimizará.Eu tenho o mesmo problema. Eu usei uma biblioteca de terceiros. Quando eu compilar esta biblioteca, o compilador (gcc / clang) reclamará sobre variáveis não utilizadas.
Como isso
Portanto, a solução é bastante clara. Adicionar
-Wno-unused
CFLAG como gcc / clang suprimirá todos os avisos "não utilizados", mesmo que você tenha-Wall
definido.Dessa forma, você NÃO PRECISA alterar nenhum código.
fonte
No MSVC, para suprimir um aviso específico, basta especificar o número do compilador como / wd #. Meu CMakeLists.txt contém esse bloco:
Agora, não posso dizer o que exatamente / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127 significa, porque não presto atenção à MSVC por três anos, mas suprimem avisos super-atlânticos que não influenciam o resultado.
fonte
Eu já vi esse estilo sendo usado:
fonte
struct { int a; } b = {1}; if (b);
O GCC adverteused struct type value where scalar is required
,.Para o registro, eu gosto da resposta de Jó acima, mas estou curioso sobre uma solução usando apenas o nome da variável em uma declaração "não faça nada":
Claro, isso tem desvantagens; por exemplo, sem a nota "não utilizada", parece um erro e não uma linha de código intencional.
O benefício é que nenhum DEFINE é necessário e elimina o aviso.
Existe algum desempenho, otimização ou outras diferenças?
fonte