2010-03-25 40 views
12

Por alguna razón, mi Visual Studio 2008 comenzó a mostrar advertencias para el código como: "int main (int argc, char ** argv)", que es realmente molesto.Cómo lidiar con la Advertencia C4100 en Visual Studio 2008

Las Salidas de advertencia detallada son (se puede ignorar los números de línea):
1> \ main.cpp (86):. 'Argv':: C4100 de advertencia. Parámetro formal sin referencia
1> \ main.cpp (86): advertencia C4100: 'argc': parámetro formal sin referencia

Me pregunto si hay configuraciones en Visual Studio 2008 que se hayan cambiado accidentalmente. ¿O cómo debería lidiar con esta advertencia?

Respuesta

18

Si los parámetros son sin referencias, puede dejarlos sin nombre:

int main(int, char**) 
{ 
} 

en lugar de

int main(int argc, char** argv) 
{ 
} 

Si realmente quiere sólo para suprimir la advertencia, puede hacerlo utilizando el comando /wd4100 opción de línea al compilador o usando #pragma warning(disable: 4100) en su código.

Esta es una advertencia de nivel 4; Si compila en un nivel de advertencia más bajo, no recibirá esta advertencia. El nivel de advertencia se establece en las propiedades del proyecto (haga clic derecho en el proyecto, seleccione Propiedades; en Propiedades de configuración -> C++ -> General, establezca "Nivel de advertencia").

+0

¿Existe alguna configuración en VS2008 con la que pueda jugar? Porque para los códigos que escribí antes, esta advertencia C4100 aparece con los compilo. Gracias. – Jimmie

+0

@Jimmie: Sí; puede cambiar el nivel de advertencia de su proyecto a un nivel de advertencia más bajo (p. ej., nivel 3). –

+3

Tenga en cuenta que tener parámetros sin nombre en la definición de la función es correcto en C++, pero si se compila como C, es un error (una pequeña irritación a veces cuando se trata de escribir código que se compila de cualquier manera). –

4

Advertencia C4100 se emite en el nivel de advertencia 4, que no es el predeterminado, por lo que en algún momento alguien probablemente lo cambió para su proyecto.

Puede cambiar el nivel de advertencia, o abordar la advertencia más directamente.

Como James McNellis said, puede silenciar la advertencia en C++ eliminando el nombre del parámetro de la lista de parámetros. Sin embargo, si el código se compilará como código C, obtendrá un error en ese caso.

Los encabezados de Windows definen la macro UNREFERENCED_PARAMETER() para ayudar a manejar esta advertencia. Puede usar

UNREFERENCED_PARAMETER(argc); 
UNREFERENCED_PARAMETER(argv); 

para silenciar la advertencia. Si no desea incluir las cabeceras de las ventanas, la macro simplemente se expande a un uso del nombre del parámetro en una expresión de no hacer nada:

#define UNREFERENCED_PARAMETER(P)   \ 
    /*lint -save -e527 -e530 */ \ 
    { \ 
     (P) = (P); \ 
    } \ 
    /*lint -restore */ 
+2

No tenía conocimiento de 'UNREFERENCED_PARAMETER'; Es bueno saberlo. En los encabezados de Windows, hay dos versiones. El que está habilitado por defecto simplemente se expande a '(P)'. El otro, que usted cita, se expande a '(P) = (P);', y se usa si 'lint' está definido; este no tendrá los parámetros de tipos const o no asignables. –

+0

@James - la definición más 'complicada' es justo lo que sucedió con mis ctags cuando salté (debería haberme desplazado un poco, sobre todo porque estaba un poco sorprendido de que la expansión no fuera '(P)'). –

5

Si usted no está utilizando los parámetros de línea de comandos a continuación, la otra firma estándar para main es:

int main(); 
+0

La otra firma estándar tiene un vacío entre esos corchetes, ¿no es así? – paxdiablo

+3

Sí, en C; no hay diferencia en C++ porque son equivalentes. La pregunta fue etiquetada como C++, así que fui con la forma de ningún parámetro que utilizo habitualmente en C++. –

Cuestiones relacionadas