En programmation informatique , une déclaration est une construction de langage spécifiant les propriétés d'un identifiant : elle déclare la signification d'un mot (identifiant). Les déclarations sont le plus souvent utilisées pour les fonctions , les variables , les constantes et les classes , mais peuvent également être utilisées pour d'autres entités telles que les énumérations et les définitions de type. Au-delà du nom (l'identifiant lui-même) et du type d'entité (fonction, variable, etc.), les déclarations spécifient généralement le type de données (pour les variables et les constantes) ou la signature de type (pour les fonctions) ; les types peuvent également inclure des dimensions, comme pour les tableaux . Une déclaration est utilisée pour annoncer l'existence de l'entité au compilateur ; cela est important dans les langages fortement typés qui nécessitent que les fonctions, les variables et les constantes, ainsi que leurs types, soient spécifiés avec une déclaration avant utilisation, et est utilisé dans la déclaration anticipée . Le terme « déclaration » est fréquemment mis en contraste avec le terme « définition », mais la signification et l'utilisation varient considérablement selon les langages ; voir ci-dessous.
Les déclarations sont particulièrement importantes dans les langages de la tradition ALGOL , notamment dans la famille BCPL , notamment C et C++ , ainsi que Pascal . Java utilise le terme « déclaration », bien que Java ne nécessite pas de déclarations et de définitions séparées.
Déclaration vs. définition
Une dichotomie fondamentale est de savoir si une déclaration contient ou non une définition : par exemple, si une déclaration de variable ou de constante spécifie sa valeur , ou seulement son type ; et de même si une déclaration d'une fonction spécifie le corps ( implémentation ) de la fonction, ou seulement sa signature de type. Tous les langages ne font pas cette distinction : dans de nombreux langages, les déclarations incluent toujours une définition, et peuvent être appelées « déclarations » ou « définitions », selon le langage. Cependant, ces concepts sont distingués dans les langages qui nécessitent une déclaration avant utilisation (pour lesquels des déclarations anticipées sont utilisées), et dans les langages où l'interface et l'implémentation sont séparées : l'interface contient des déclarations, l'implémentation contient des définitions.
Dans l'usage informel, une « déclaration » fait uniquement référence à une déclaration pure (types uniquement, pas de valeur ni de corps), tandis qu'une « définition » fait référence à une déclaration qui inclut une valeur ou un corps. Cependant, dans l'usage formel (dans les spécifications de langage), « déclaration » inclut ces deux sens, avec des distinctions plus fines selon le langage : en C et C++, une déclaration d'une fonction qui n'inclut pas de corps est appelée prototype de fonction , tandis qu'une déclaration d'une fonction qui inclut un corps est appelée « définition de fonction ». En Java, les déclarations se présentent sous deux formes. Pour les méthodes publiques, elles peuvent être présentées dans des interfaces sous forme de signatures de méthode, qui se composent des noms de méthode, des types d'entrée et du type de sortie. Une notation similaire peut être utilisée dans la définition de méthodes abstraites , qui ne contiennent pas de définition. La classe englobante peut être instanciée, mais une nouvelle classe dérivée, qui fournit la définition de la méthode, devrait être créée afin de créer une instance de la classe. À partir de Java 8 , l'expression lambda a été incluse dans le langage, ce qui pourrait être considéré comme une déclaration de fonction.
Déclarations et définitions
Dans la famille C des langages de programmation, les déclarations sont souvent rassemblées dans des fichiers d'en-tête , qui sont inclus dans d'autres fichiers sources qui référencent et utilisent ces déclarations, mais n'ont pas accès à la définition. Les informations contenues dans le fichier d'en-tête fournissent l'interface entre le code qui utilise la déclaration et celui qui la définit, une forme de masquage d'informations . Une déclaration est souvent utilisée pour accéder à des fonctions ou des variables définies dans différents fichiers sources, ou dans une bibliothèque . Une incompatibilité entre le type de définition et le type de déclaration génère une erreur de compilation.
Pour les variables, les définitions attribuent des valeurs à une zone de mémoire réservée lors de la phase de déclaration. Pour les fonctions, les définitions fournissent le corps de la fonction. Bien qu'une variable ou une fonction puisse être déclarée plusieurs fois, elle est généralement définie une seule fois (en C++ , on parle de règle de définition unique ou ODR).
Les langages dynamiques comme JavaScript ou Python permettent généralement de redéfinir, c'est-à-dire de re-lier , des fonctions ; une fonction est une variable comme une autre, avec un nom et une valeur (la définition).
Voici quelques exemples de déclarations qui ne sont pas des définitions, en C :
extern char exemple1 ; extern int exemple2 ; void exemple3 ( void );
Voici quelques exemples de déclarations qui sont des définitions, toujours en C :
char example1 ; /* En dehors d'une définition de fonction, elle sera initialisée à zéro. */ int example2 = 5 ; void example3 ( void ) { /* définition entre accolades */ }
Variables non définies
Dans certains langages de programmation, une déclaration implicite est fournie la première fois qu'une telle variable est rencontrée au moment de la compilation . Dans d'autres langages, une telle utilisation est considérée comme une erreur, ce qui peut entraîner un message de diagnostic. Certains langages ont commencé avec le comportement de déclaration implicite, mais au fur et à mesure de leur évolution, ils ont fourni une option pour la désactiver (par exemple de Perluse strict ou de Visual BasicOption Explicit ).