2010-03-05 10 views
6

Actualmente tengo un proyecto que usa g ++ para compilar su código. Estoy en el proceso de limpiar el código, y me gustaría asegurar que todas las funciones tengan prototipos para garantizar que cosas como const char * se manejen correctamente. Por desgracia, g ++ se queja cuando intento para especificar -Wmissing-prototipos:¿Cómo obtengo las advertencias de prototipo de g ++ faltantes?

g++ -Wmissing-prototypes -Wall -Werror -c foo.cpp 
cc1plus: warning: command line option "-Wmissing-prototypes" is valid for Ada/C/ObjC but not for C++ 

¿Puede alguien decirme:
1) ¿Por qué GCC esto no es válida? ¿Es esto un error en gcc?
2) ¿Hay alguna manera de activar esta advertencia?

EDIT:

Aquí hay un corte y pegue ejemplo:

cat > foo.cpp <<EOF 
void myfunc(int arg1, int arg2) 
{ 
    /* do stuff with arg1, arg2 */ 
} 
EOF 
g++ -Wmissing-prototypes -c foo.cpp # complains about not valid 
g++ -c foo.cpp      # no warnings 
# Compile in C mode, warning appears as expected: 
g++ -x c -Wmissing-prototypes -c foo.cpp 
+0

No estoy seguro de cómo ese archivo foo.cpp debería arrojar una advertencia de "no prototipo". La definición de función que se muestra * does * incluye un prototipo. –

+0

Puede ser, en lugar de solo preguntar cómo activar las advertencias que parecen no tener sentido en C++ (como dice la advertencia), publica algún ejemplo de qué tipo de error es que quieres detectar que el compilador de C++ ya no funciona t catch ("asegurando que' const char * 'se maneje correctamente")? – UncleBens

+0

¿Dónde ves un prototipo? El código de ejemplo no incluye un archivo de encabezado, y no tiene una línea de prototipo separada en el archivo foo.cpp. – Eric

Respuesta

3

¿Has probado -Wmissing-declarations? Eso parece funcionar para g ++ y detectar el caso de error que describes. No estoy seguro en qué versión lo agregaron, pero me funciona en 4.3.3.

+0

Gracias, eso parece ser lo que necesito. Ahora solo necesito descubrir cómo actualizar la versión de GCC en mis máquinas RHEL5. – Eric

7

-Wmissing-prototypes no es aplicable para C++, C++, porque siempre requiere de prototipos.

Tome la siguiente declaración por ejemplo:

void foo(); 
  • En C, foo se puede llamar con cualquier número y tipo de argumentos.
  • En C++, foo no toma ningún argumento (error de compilación si se transfiere algún argumento).
10

Cuando compila un archivo con extensión .cpp, se compila como código C++ de forma predeterminada. En el lenguaje C++, el requisito de declaraciones de funciones es un requisito obligatorio y difícil. No tiene sentido hacer una opción -Wmissing-prototypes para C++.

En otras palabras, no se puede "activar esta advertencia " en C++ porque "falta prototipo" es siempre un error en C++.

P.S. Como nota al margen: la noción de prototipo es específica para el lenguaje C solamente. No hay "prototipos" en C++.

En lenguaje C una función declaración puede ser un prototipo o no un prototipo, de ahí la necesidad de un término adicional para distinguir unas de otras. En C++, las declaraciones de funciones son siempre "prototipos" (desde el punto de vista C), por lo que en C++ simplemente no hay necesidad de este término adicional. En C++, las declaraciones de funciones son simplemente declaraciones de función . Eso solo lo dice todo.

EDIT: Después de leer su comentario llegué a la conclusión de que debe haber entendido mal el significado y el propósito de la opción -Wmissing-prototypes y la alerta correspondiente. Tenga en cuenta que esta opción no verificará si ha incluido prototipos de todas sus funciones en algún archivo de cabecera. No hay ninguna opción para hacer eso en GCC, independientemente de si está usando C o C++.

El propósito de -Wmissing-prototypes es diferente.Esta opción solo funciona cuando llama al una función que no tiene un prototipo visible en el punto de la llamada. En lenguaje C, hacer esto es legal, pero si desea una advertencia en este caso, use la opción -Wmissing-prototypes. En lenguaje C++ llamar a una función que no tiene declaración visible ("prototipo") en el punto de la llamada siempre es un error inmediato, por lo que los compiladores C++ no necesitan ninguna opción como -Wmissing-prototypes.

En otras palabras, si ha definido alguna función en algún archivo de implementación, pero se olvidó de incluir un prototipo para esta función en algún archivo de cabecera, que no recibirá advertencias del compilador hasta que realmente intenta llamada que función. No importa si su código es C o C++, si usa -Wmissing-prototypes o no ... Hasta que intente llamar a la función, no habrá advertencias.

Pero una vez que intenta llamar a una función sin un prototipo, el compilador C informará una advertencia (si usó -Wmissing-prototypes) y el compilador C++ siempre informará de un error.

+0

Eso no es cierto, al menos no con gcc. Compilará felizmente un archivo .cpp que tenga funciones sin un prototipo. Esto significa que puedo tener foo.cpp con una función implementada como void myfunc (int arg1, int arg2) {/ * use arg1 y arg2 * /} pero si el archivo de encabezado dice void myfunc (int arg1); ¡entonces las personas que llaman no estarán sincronizadas, y no habrá ninguna indicación de eso del compilador! – Eric

+3

@Eric: Lo siento, pero lo que dices no tiene sentido. En primer lugar, en C++ el compilador * no le permitirá * llamar a una función no declarada, punto. En segundo lugar, su ejemplo con 'myfunc' es completamente irrelevante. En C++ 'myfunc (int, int)' y 'myfunc (int)' son * dos funciones completamente diferentes * (sobrecargadas). Las personas que llaman no estarán "fuera de sincronización". Las personas que llaman simplemente llamarán a otra función (suponiendo que también esté definida). Esa es una cuestión de su intención, no una cuestión de "indicación del compilador". No hay error/problema en C++, por lo que esperar algo del compilador sería bastante extraño. – AnT

+2

Si olvida definir 'myfunc (int)', entonces obtendrá un error del enlazador, por supuesto. Pero nuevamente, 'myfunc (int)' y 'myfunc (int, int)' son dos funciones independientes completamente diferentes en C++. Es su responsabilidad declarar y llamar al correcto. Si llama a 'myfunc (int)', el compilador asumirá que eso es lo que quería. Si de verdad deseaba llamar a 'myfunc (int, int)' pero llamado 'myfunc (int)' por error ... lo siento, el compilador no puede leer su mente para calcular a cuál realmente * quería * llamar. – AnT

Cuestiones relacionadas