Por ejemplo:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
En C ++ pude poner un /*...*/
comentario sobre los parámetros. Pero no en C, por supuesto, donde me da el error error: parameter name omitted
.
c
gcc
gcc-warning
nixgadget
fuente
fuente
-Wno-unused-parameter
, es demasiado ruidoso y rara vez atrapa errores, especialmente. cuando-Wshadow
se usaRespuestas:
Normalmente escribo una macro como esta:
Puede usar esta macro para todos sus parámetros no utilizados. (Tenga en cuenta que esto funciona en cualquier compilador).
Por ejemplo:
fuente
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
que me permite aplicar esto a múltiples variables.En gcc, puede etiquetar el parámetro con el
unused
atributo .En la práctica, esto se logra colocando
__attribute__ ((unused))
justo antes del parámetro. Por ejemplo:se convierte
fuente
__attribute__ ((unused))
delante del argumento.__attribute__((unused))
es una extensión patentada de GCC . Es compatible con algunos otros compiladores, pero supongo que esto no funcionará con MSVC. Sin embargo, no es directamente parte del estándar del compilador, por lo que no es tan portátil como algunas otras opcionesPuede usar el atributo no utilizado de gcc / clang, sin embargo, uso estas macros en un encabezado para evitar tener atributos específicos de gcc en toda la fuente, también tener en
__attribute__
todas partes es un poco detallado / feo.Entonces puedes hacer ...
Prefiero esto porque obtienes un error si intentas usar
bar
el código en cualquier lugar para que no puedas dejar el atributo por error.y para funciones ...
Nota 1):
Hasta donde yo sé, MSVC no tiene un equivalente a
__attribute__((__unused__))
.Nota 2):
la
UNUSED
macro no funcionará para los argumentos que contienen paréntesis,por lo que si tiene un argumento
float (*coords)[3]
que no puede hacer,float UNUSED((*coords)[3])
ofloat (*UNUSED(coords))[3]
, este es el único inconveniente de laUNUSED
macro que encontré hasta ahora, en estos casos retrocedo a(void)coords;
fuente
#define __attribute__(x)
para un entorno que no sea GCC (AFAIK, ninguno de ellos__attribute__
es compatible con MSVC)?warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)Con gcc con el atributo no utilizado:
fuente
Al ver que esto está marcado como gcc, puede usar el interruptor de línea de comando
Wno-unused-parameter
.Por ejemplo:
Por supuesto, esto afecta todo el archivo (y tal vez el proyecto depende de dónde configuró el interruptor), pero no tiene que cambiar ningún código.
fuente
Una forma específica de gcc / g ++ para suprimir la advertencia de parámetro no utilizado para un bloque de código fuente es encerrarlo con las siguientes declaraciones de pragma:
fuente
Etiquetar el atributo es la forma ideal. MACRO conduce a la confusión en algún momento. y al usar void (x), estamos agregando una sobrecarga en el procesamiento.
Si no usa el argumento de entrada, use
Si no usa la variable definida dentro de la función
Ahora más tarde usando la variable hash para su lógica, pero no necesita bkt. defina bkt como no utilizado, de lo contrario el compilador dice 'bkt set bt no utilizado ".
NOTA: Esto es solo para suprimir la advertencia, no para la optimización.
fuente
void(x)
, el compilador lo optimizará.Tengo el mismo problema. Usé una biblioteca de terceros. Cuando compilo esta biblioteca, el compilador (gcc / clang) se quejará de las variables no utilizadas.
Me gusta esto
Entonces la solución es bastante clara. Agregar
-Wno-unused
como gcc / clang CFLAG suprimirá todas las advertencias "no utilizadas", incluso aunque haya-Wall
configurado.De esta manera, NO NECESITA cambiar ningún código.
fuente
En MSVC para suprimir una advertencia particular, es suficiente especificar el número para compilar como / wd #. Mi CMakeLists.txt contiene tal bloque:
Ahora no puedo decir qué significa exactamente / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127, porque no presto ninguna atención al MSVC durante tres años, pero suprimen las advertencias superpedantes que no influyen en el resultado.
fuente
He visto que se usa este estilo:
fuente
struct { int a; } b = {1}; if (b);
GCC advierteused struct type value where scalar is required
.Para el registro, me gusta la respuesta de Job anterior, pero tengo curiosidad acerca de una solución que solo usa el nombre de la variable en sí mismo en una declaración de "no hacer nada":
Claro, esto tiene inconvenientes; por ejemplo, sin la nota "no utilizada" parece un error en lugar de una línea de código intencional.
El beneficio es que no se necesita DEFINE y se elimina la advertencia.
¿Hay algún rendimiento, optimización u otras diferencias?
fuente