[Question inspired by a comment thread at this answer.]
Como todos saben, desde C99 es un error llamar a una función que no ha sido declarada, preferiblemente con un prototipo adecuado.
Pero, más allá de eso, quiero que mi compilador me avise si definir una función sin una declaración de prototipo en el alcance, presumiblemente incluida fuera del mismo archivo de encabezado que usan las personas que llaman. (A menos que la función sea estática, en cuyo caso todo esto es discutible).
La razón debería ser obvia: si hay una declaración de prototipo en un encabezado, y todos los que llaman la incluyen, pero no está incluida en el archivo donde se define la función, y si la definición real de la función difiere de alguna manera del prototipo externo, entonces toda la verificación de prototipos realizada en nombre de las personas que llaman no tiene valor y, de hecho, es contraproducentemente incorrecta. Hay un error evidente, pero no se garantiza que se detecte en absoluto.
¿Existen compiladores comunes que puedan verificar esto? Probé tanto gcc como clang con -Wall, y no lo hacen. (Me imagino que la pelusa de Gimpel, si todavía está disponible, haría esto, pero no tengo una copia).
Idealmente, me gustaría que también insistiera en que el prototipo existe en un archivo de encabezado separado, pero eso es diferente, así que no insisto en eso. (La razón de esta estipulación adicional sería que algunos programadores, acosados por el mensaje de advertencia hipotético, podrían intentar silenciarlo escribiendo un prototipo externo en la parte superior de la pantalla). .c
archivo que contiene la definición, que, de nuevo, anularía el propósito.)
Para eso probablemente deberías mirar un analizador de código estático en lugar del compilador, porque no declarar un prototipo en un archivo de encabezado no es realmente un problema, siempre que haya una declaración algun lado antes de llamar a la función. La declaración podría incluso ser parte de la propia definición de la función. Incluso hay personas con estilos de código que no colocan prototipos en los archivos de encabezado, sino solo en los archivos fuente donde se llaman las funciones.
– Un tipo programador
17 mayo 2018 a las 22:04
¿Qué quiere decir con “función global”. Supongo que “función con enlace externo”
–MM
17 mayo 2018 a las 22:35
@Someprogrammerdude Lo del archivo de encabezado separado era secundario; la preocupación principal es simplemente tener la advertencia de “definición sin prototipo”. He aclarado la pregunta. Pero tiene razón, lo que pido suena más como un analizador separado, excepto que GNU, al menos, ha declarado su oposición a los analizadores separados, ha declarado que el compilador debería hacer todo lo que un analizador separado el programa podría haberlo hecho alguna vez. (Al menos, dijeron esto una vez; no sé si sigue siendo su posición).
– Steve cumbre
17 mayo 2018 a las 23:00
@MM Sí. Pregunta aclarada.
– Steve cumbre
17 mayo 2018 a las 23:01
Hay bastantes opciones relacionadas que ayudan:
-Wmissing-prototypes
,-Wstrict-prototypes
,-Wold-style-definitions
,-Wold-style-declarations
Una de las advertencias “antiguas” no es compatible conclang
(-Wold-style-declaration
), y las diferentes versiones de GCC pueden admitir más o menos (los compiladores más antiguos admiten menos).–Jonathan Leffler
18 de mayo de 2018 a las 4:44