Prototypes de fonction
Une déclaration de fonction précède la définition de fonction et spécifie le nom, le type de retour, la classe de stockage, et d'autres attributs de la fonction.Pour être un prototype, la déclaration de fonction doit également générer des types et des identificateurs pour les arguments de la fonction.
Syntaxe
declaration:
init-déclarateur-liste attribut- seqopt**;**optde déclaration-spécificateurs/* attribut-seqoptest spécifique de Microsoft *
déclaration-spécificateurs:
déclaration-spécificateurs de stockage-classe-spécificateur optdéclaration-spécificateurs de spécificateur de type opt
déclaration-spécificateurs de type-qualificateur opt
init-déclarateur-liste:
init-déclarateurinit-déclarateur deServeur IIS local d'init-déclarateur-liste
init-déclarateur:
déclarateurdéclarateur = initialiseur
declarator:
direct-déclarateuroptdepointeurdirect-déclarateur: Déclarateur de fonction de/* le quantificateur *
déclarateur de nouveau style de**)** /* de paramètre-type-liste de**(** de direct-déclarateur *déclarateur de style obsolète de**)**opt/* d'identificateur-liste de ( de direct-déclarateur *
Le prototype a le même formulaire que la définition de fonction, mais il est terminée par un point-virgule qui suit immédiatement la parenthèse fermante et par conséquent n'a pas de corps.Dans les deux cas, le type de retour doit être conforme au type de retour spécifié dans la définition de la fonction.
Les prototypes de fonctions ont les utilisations importantes suivantes :
Ils définissent le type de retour pour les fonctions que des types de retour autres que int.Bien que les fonctions qui int de retour évalue ne requièrent pas des prototypes, les prototypes sont recommandés.
Sans prototypes complets, les conversions standard sont réalisées, mais aucune tentative n'est faite pour activer le type ou le nombre d'arguments avec le nombre de paramètres.
Des prototypes sont utilisés pour initialiser les pointeurs fonction avant que ces fonctions soient définies.
La liste de paramètres est utilisée pour activer la correspondance des arguments de l'appel de fonction avec les paramètres de la définition de la fonction.
le type converti de chaque paramètre détermine la traduction des arguments que l'appel de fonction place sur la pile.Une incompatibilité de type entre un argument et un paramètre peut provoquer des arguments dans la pile d'interpréter de façon erronée.Par exemple, sur un ordinateur 16 bits, si un pointeur 16 bits est passé comme argument, alors déclaré comme paramètre de long , les 32 premiers bits sur la pile sont interprètes comme paramètre de long .Cette erreur crée des problèmes non seulement avec le paramètre de long , mais avec tous les paramètres qui le suit.Vous pouvez détecter les erreurs de ce type en déclarant les prototypes de fonction terminés pour toutes les fonctions.
Un prototype génère les attributs d'une fonction afin que les appels à la fonction qui précèdent sa définition (ou générer dans d'autres fichiers sources) puissent être activés pour les incompatibilités de type d'argument et de type de retour.Par exemple, si vous spécifiez le spécificateur de classe de stockage de statique dans un prototype, vous devez également spécifier la classe de stockage de statique dans la définition de la fonction.
Les déclarations complètes de paramètre (int a) peuvent être combinées avec les déclarateurs abstraits (int) dans la même déclaration.Par exemple, la déclaration suivante est conforme :
int add( int a, int );
Le prototype peut inclure que le type, et un identificateur pour, de chaque expression passée comme argument.Toutefois, ces identificateurs ont une portée uniquement jusqu'à la fin de la déclaration.le prototype peut également refléter le fait que le nombre d'arguments est variable, ou qu'aucun argument n'est passé.Sans cette liste, les incompatibilités ne peuvent être définie, le compilateur ne peut pas générer les messages de diagnostic relatives à eux.Consultez l' arguments pour plus d'informations sur la vérification de type.
La portée de prototype dans le compilateur C Microsoft est maintenant ANSI-conforme lors de la compilation avec l'option du compilateur /Za.Cela signifie que si vous déclarez une balise d' struct ou d' union dans un prototype, la balise est entré à cette portée plutôt qu'au niveau de la portée globale.Par exemple, lors de la compilation avec /Za pour la compatibilité ANSI, vous pouvez ne pas nécessaire d'appeler cette fonction sans obtenir une erreur d'incompatibilité de type :
void func1( struct S * );
Pour corriger votre code, définissez ou déclarez struct ou union au niveau de la portée globale avant le prototype de fonction :
struct S;
void func1( struct S * );
sous /Ze, la balise est encore entrée au niveau de la portée globale.