Palavras-chave: warning, unused parameter, variable
Em alguns casos temos que implementar uma função (na maioria dos casos uma callback) cujo o protótipo já é definido pela API utilizada. Alguns parâmetros podem ser desnecessários, mas geram warnings de compilação caso não forem utilizados. O exemplo a seguir gera um warning quando compilado com o gcc:
void my_callback(char *data, int size) { printf("Size is %d\n", size); return; } foo.c:2: warning: unused parameter 'data'
Podemos contornar esta situação de duas formas. A primeira e mais portável é fazer um cast para o tipo void:
void my_callback(char *data, int size) { (void) data; printf("Size is %d\n", size); return; }
A segunda forma é usar uma extensão do gcc:
void my_callback(char *data __attribute__((unused)), int size) { printf("Size is %d\n", size); return; }
O cast pode ser feito utilizando uma macro. Algo do tipo:
#define UNUSED(x) ((void) (x))
void my_callback(char *data, int size)
{
UNUSED (data);
printf(“Size is %dn”, size);
return;
}
[]’s
Um acréscimo:
Em C++ (mas não em C), é possível simplesmente omitir o nome do parâmetro que não vai ser usado:
void my_callback(char *, int size)
{
printf(“Size is %d\n”, size);
}
Marcus: mas omitindo o parâmetro, sua callback não casa mais com a declaração original e não será chamada quando devia. Ou seja: não é porque dá pra ter vários métodos com o mesmo nome mas com um número diferente de parâmetros que eles sejam o mesmo… é justamente o contrário: embora tenham os mesmos nomes, são métodos diferentes.
A sua callback só será executada se o programa principal tiver conhecimento e chamar explicitamente essa versão com apenas um parâmetro, o que não é o objetivo do examplo uma vez que estamos falando de callbacks.
Ademar, ele não removeu o parâmetro, ele só omitiu o nome do parâmetro na declaração. A dica dele é válida, para quem está usando C++.