En programmation informatique , une déclaration anticipée est une déclaration d'un identificateur (désignant une entité telle qu'un type, une variable, une constante ou une fonction) pour lequel le programmeur n'a pas encore donné de définition complète .
Un compilateur doit connaître certaines propriétés d'un identificateur (taille pour l'allocation mémoire , type de données pour la vérification des types , comme la signature des fonctions), mais il n'a pas besoin de connaître d'autres détails, tels que sa valeur (dans le cas des variables ou des constantes) ou sa définition (dans le cas des fonctions). Ceci est particulièrement utile pour les compilateurs à passe unique et la récursivité mutuelle dans ces langages, car il est impossible de définir de telles fonctions (ou structures de données) sans une référence anticipée dans une définition : l’une des fonctions (ou structures de données) doit être déclarée en premier. Elle permet également une organisation flexible du code, par exemple si l’on souhaite placer le corps principal en haut et les fonctions appelées en dessous.
Dans d'autres langages, les déclarations anticipées ne sont pas nécessaires, ce qui requiert généralement un compilateur multipasse et le report de certaines étapes de compilation à l'étape de liaison . Dans ces cas, les identificateurs doivent être définis (variables initialisées, fonctions définies) avant de pouvoir être utilisés à l'exécution, sans qu'il soit nécessaire de les définir au préalable dans le code source, ni pour la compilation ni pour l'interprétation : les identificateurs n'ont pas besoin d'être immédiatement résolus en une entité existante.
C et C++ , la ligne ci-dessus représente une déclaration anticipée d'une fonction et constitue son prototype . Après traitement de cette déclaration, le compilateur autorise le code du programme à faire référence à cette entitéprintThisIntegerdans le reste du programme. La définition d'une fonction doit être fournie quelque part (dans le même fichier ou un autre, auquel cas il incombe à l'éditeur de liens de faire correspondre correctement les références à une fonction particulière dans un ou plusieurs fichiers objets avec sa définition, qui doit être unique, dans un autre fichier).Les variables peuvent être déclarées à l'avance et ne pas être définies. Lors de la compilation, elles sont initialisées selon les règles spécifiques au langage (à des valeurs indéfinies, à 0, à des pointeurs NULL, etc.). Les variables définies dans d'autres fichiers source ou objet doivent être déclarées à l'avance à l'aide du mot-clé `@` extern.
second a été utilisé sans avoir été déclaré.Cours
Dans certains langages orientés objet comme C++ et Objective-C , il est parfois nécessaire de déclarer les classes par anticipation. Cela se fait lorsqu'il est indispensable de savoir que le nom de la classe est un type, sans pour autant connaître sa structure.
En C++, les classes et les structures peuvent être déclarées à l'avance comme ceci :
La déclaration anticipée d'une classe n'est pas suffisante si vous devez utiliser le type réel de la classe, par exemple si vous avez un membre dont le type est directement cette classe (et non un pointeur), ou si vous devez l'utiliser comme classe de base, ou si vous devez utiliser les méthodes de la classe dans une méthode.
En Objective-C, les classes et les protocoles peuvent être déclarés à l'avance comme ceci :
La déclaration anticipée d'une classe ou d'un protocole n'est pas suffisante si vous devez créer une sous-classe de cette classe ou implémenter ce protocole.
Référence en avant
Le terme « référence anticipée » est parfois utilisé comme synonyme de « déclaration anticipée » . Cependant, il désigne plus souvent l’ utilisation effective d’une entité avant toute déclaration ; autrement dit, la première référence à `a` seconddans le code ci-dessus est une référence anticipée . Ainsi, on peut dire que, puisque les déclarations anticipées sont obligatoires en Pascal, les références anticipées sont interdites.
Un exemple de référence anticipée (valide) en C++ :
myValue , il lui incombe de mémoriser la définition de ` a` accessorjusqu'à myValuela déclaration de `a`.Autoriser les références anticipées peut considérablement augmenter la complexité et les besoins en mémoire d'un compilateur, et empêche généralement que le compilateur soit implémenté en une seule passe .