Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una declaración de función precede a la definición de función y especifica el nombre, el tipo de valor devuelto, la clase de almacenamiento y otros atributos de una función. Para ser un prototipo, la declaración de función también debe establecer tipos e identificadores para los argumentos de la función.
Sintaxis
declaration:
declaration-specifiers
attribute-seq
optarinit-declarator-listoptar;
/*
attribute-seq
opt es específico de Microsoft */
declaration-specifiers:
storage-class-specifier
declaration-specifiers
optar
type-specifier
declaration-specifiers
optar
type-qualifier
declaration-specifiers
optar
init-declarator-list:
init-declarator
init-declarator-list
,
init-declarator
init-declarator:
declarator
declarator
=
initializer
declarator:
pointer
optardirect-declarator
direct-declarator: /* Un declarador de función */
direct-declarator
(
parameter-type-list
) /* Declarador de estilo nuevo */
direct-declarator
(
identifier-list
optar) /* Declarador de estilo obsoleto */
El prototipo tiene la misma forma que la definición de función, salvo que finaliza por un punto y coma inmediatamente después del paréntesis de cierre y, por tanto, no tiene cuerpo. En cualquier caso, el tipo de valor devuelto debe estar de acuerdo con el tipo de valor devuelto especificado en la definición de función.
Los prototipos de función tienen los siguientes usos importantes:
Establecen el tipo de valor devuelto para las funciones que devuelven tipos distintos de
int. Aunque las funciones que devuelvenintvalores no requieren prototipos, se recomiendan prototipos.Sin prototipos completos, se realizan conversiones estándar, pero no se intenta comprobar el tipo o el número de argumentos con el número de parámetros.
Los prototipos se usan para inicializar punteros a funciones antes de definir esas funciones.
La lista de parámetros se usa para comprobar que los argumentos de la llamada de función coinciden con los parámetros de la definición de función.
El tipo convertido de cada parámetro determina la interpretación de los argumentos que la llamada de función coloca en la pila. Un error de coincidencia de tipo entre un argumento y un parámetro puede hacer que los argumentos de la pila se malinterpreten. Por ejemplo, en un equipo de 16 bits, si se pasa un puntero de 16 bits como argumento, después se declara como un long parámetro, los primeros 32 bits de la pila se interpretan como parámetro long . Este error crea problemas no solo con el long parámetro , sino con todos los parámetros posteriores. Puede detectar errores de este tipo declarando prototipos de función completos para todas las funciones.
Un prototipo establece los atributos de una función. A continuación, las llamadas de función que preceden a la definición de función (o que se producen en otros archivos de origen) se pueden comprobar si hay coincidencias de tipo de argumento y de tipo de valor devuelto. Por ejemplo, si especifica el static especificador de clase de almacenamiento en un prototipo, también debe especificar la static clase de almacenamiento en la definición de función.
Las declaraciones de parámetros completas (int a) se pueden mezclar con declaradores abstractos (int) en la misma declaración. Por ejemplo, la siguiente declaración es legal:
int add( int a, int );
El prototipo puede incluir el tipo de y un identificador para cada expresión que se pasa como argumento. Sin embargo, estos identificadores solo están en el ámbito hasta el final de la declaración. El prototipo también puede reflejar el hecho de que el número de argumentos es variable o que no se pasan argumentos. Sin esta lista, es posible que no se muestren coincidencias, por lo que el compilador no puede generar mensajes de diagnóstico relacionados con ellos. Para obtener más información sobre la comprobación de tipos, vea Argumentos.
El ámbito de prototipo en el compilador de Microsoft C ahora es conforme a ANSI al compilar con la /Za opción del compilador. Si declara una struct etiqueta o union dentro de un prototipo, la etiqueta se escribe en ese ámbito en lugar de en el ámbito global. Por ejemplo, al compilar con para la conformidad con /Za ANSI, nunca puede llamar a esta función sin obtener un error de coincidencia de tipos:
void func1( struct S * );
Para corregir el código, defina o declare el struct ámbito global antes union del prototipo de función:
struct S;
void func1( struct S * );
En /Ze, la etiqueta se sigue especificando en el ámbito global.