Pregunta

Tengo una biblioteca que he creado,

mylib.c:

#include <mylib.h>
int
testlib() {
    printf("Hello world\n");
    return (0);
}

mylib.h:

#include <stdio.h>
extern int testlib();

En mi programa, he intentado llamar a esta función de la biblioteca:

myprogram.c:

#include <mylib.h>

int
main (int argc, char *argv[]) {
    testlib();
    return (0);
}

Cuando intento compilar este programa me sale el siguiente error:

In file included from myprogram.c:1
mylib.h:2 warning: function declaration isn't a prototype

Yo estoy usando: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

Mi pregunta es, ¿cuál es la forma correcta de declarar un prototipo de función?

¿Fue útil?

Solución

En C int foo() y int foo(void) son funciones diferentes. int foo() acepta un número arbitrario de argumentos, mientras que int foo(void) acepta 0 argumentos.En C++ se refieren a la misma cosa.Le sugiero que use void constantemente cuando te refieres a no argumentos.

Si usted tiene una variable a, extern int a; es una forma de decirle al compilador que a es un símbolo que puede estar presente en una traducción diferente de la unidad (el compilador de C de hablar por el archivo de origen), no resuelven hasta el momento de enlazar.Por otro lado, los símbolos, los cuales son los nombres de las funciones son de todos modos se resuelve en tiempo de vínculo.El significado de un especificador de clase de almacenamiento en una función (extern, static) sólo afecta a la visibilidad y a extern es el predeterminado, por lo extern es realmente innecesario.

Sugiero la eliminación de la extern, es extraño y es generalmente omitido.

Otros consejos

Respuesta rápida:cambio int testlib() a int testlib(void) para especificar que la función no tiene argumentos.

Un prototipo es, por definición, una declaración de función que especifica el tipo(s) de el argumento de la función(s).

Un no-prototipo de la declaración de la función como

int foo();

es un viejo estilo de la declaración de que no se especifica el número de tipos de argumentos.(Antes de la de 1989 ANSI C estándar, este fue el único tipo de declaración de función disponibles en el idioma.) Usted puede llamar a una función de este tipo con cualquier número arbitrario de argumentos, y el compilador no es necesario para quejarse, pero si la convocatoria es incompatible con el definición, el programa tiene un comportamiento indefinido.

Para una función que toma uno o más argumentos, se puede especificar el tipo de cada argumento en la declaración:

int bar(int x, double y);

Funciones sin argumentos son un caso especial.Lógicamente, los paréntesis vacíos habría sido una buena manera de especificar que un argumento, pero que la sintaxis ya estaba en uso para el viejo estilo de las declaraciones de función, por lo que el ANSI C comité inventado una nueva sintaxis que utiliza el void palabra clave:

int foo(void); /* foo takes no arguments */

Una función definición (que incluye el código por lo que la función hace en realidad) también proporciona una declaración.En su caso, usted tiene algo similar a:

int testlib()
{
    /* code that implements testlib */
}

Esta es una no-prototipo de la declaración de testlib.Como una definición, esto le dice al compilador que testlib no tiene parámetros, sino como una declaración, lo único que le dice al compilador que testlib toma algunos no especificado, pero fija el número y tipo(s) de los argumentos.

Si cambia () a (void) la declaración se convierte en un prototipo.

La ventaja de un prototipo es que si accidentalmente se llame testlib con uno o más argumentos, que el compilador de diagnosticar el error.

C++ tiene ligeramente diferentes reglas.C++ no tiene estilo antiguo de las declaraciones de función y los paréntesis vacíos específicamente significa que una función no tiene argumentos.C++ soporta el (void) la sintaxis para mantener la coherencia con C.Pero a menos que específicamente necesita que el código compile tanto como C y C++, probablemente, usted debe utilizar el () en C++ y el (void) la sintaxis de C.)

Probar:

extern int testlib(void);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top