Question

Im un peu confus. Quelle est la différence entre la déclaration avant et référence vers l'avant? déclaration anticipée est, dans ma tête, lorsque vous déclarez une fonction qui isnt encore mis en œuvre, mais est-ce incorrect? Avez-vous de regarder la situation spécifié pour déclarer un cas de « référence avant » ou « déclaration anticipée »?

Était-ce utile?

La solution

De Wikipedia :

  

Déclaration avant

     

Déclaration d'une variable ou une fonction qui ne sont pas encore définis. Leur défnition peut être vu plus tard.

     

Forward Référence

     

Dans le même à la déclaration avant mais où la variable ou la fonction apparaît d'abord la définition est également en place.

Autres conseils

Déclaration avant est la déclaration d'une méthode ou variable avant d'implémenter et de l'utiliser. Le but des déclarations avant est de gagner du temps de compilation.

La déclaration avant d'une variable provoque l'espace de stockage pour être mis de côté, de sorte que vous pouvez définir plus tard, la valeur de cette variable.

La déclaration avant d'une fonction est également appelée un « prototype de fonction » et est une déclaration de déclaration qui indique au compilateur le type de retour d'une fonction est, ce que le nom de la fonction est, et les types de ses paramètres. Dans Compilateurs langages tels que C / C ++ et stocker Pascal ont déclaré des symboles (qui comprennent les fonctions) dans une table de consultation et les références eux comme il les rencontre dans votre code. Ces compilateurs lisent votre séquence de code, qui est, de haut en bas, donc si vous ne déclarez pas en avant, le compilateur découvre un symbole qu'il ne peut pas faire référence dans la table de consultation, et il génère une erreur qu'il ne sait pas comment répondre à la fonction.

La déclaration avant est une indication pour le compilateur que vous avez défini (rempli la mise en œuvre) la fonction ailleurs.

Par exemple:

int first(int x); // forward declaration of first

...

int first(int x) {
   if (x == 0) return 1;
   else return 2;
}

Mais, demandez-vous, pourquoi ne pas nous avons juste le compilateur faire deux passes sur chaque fichier source: le premier à l'index tous les symboles à l'intérieur, et la seconde pour analyser les références et les chercher? Selon Dan histoire:

  

Quand C a été créé en 1972, les ressources informatiques étaient beaucoup plus rares   et à une prime élevée - la mémoire nécessaire pour stocker un complexe   toute la table symbolique du programme à la fois tout simplement pas disponible en   la plupart des systèmes. stockage fixe était également coûteux, et très lent, donc   idées comme mémoire virtuelle ou stockage de parties de la table symbolique sur   simplement le disque n'aurait pas permis la compilation dans un délai raisonnable   calendrier ... Lorsque vous avez affaire à une bande magnétique où les temps de recherche   ont été mesurés en secondes et lire le débit a été mesurée en octets par   seconde (non kilo-octets ou méga-octets), qui était assez significatif.

     

C ++, tout créé près de 17 ans plus tard, a été défini comme un surensemble   de C, et doit donc utiliser le même mécanisme.

     

Au moment où Java enroulé autour en 1995, les ordinateurs en moyenne avaient assez   mémoire qui tient une table symbolique, même pour un projet complexe, était   plus un lourd fardeau. Et Java n'a pas été conçu pour être   rétrocompatible avec C, donc il n'a pas besoin d'adopter un héritage   mécanisme. C # a été de même non grevés.

     

En conséquence, leurs concepteurs ont choisi de déplacer la charge de   compartimenter déclaration symbolique dégagez le programmeur et   mettre sur l'ordinateur à nouveau, puisque son coût proportionnellement à la   l'effort total de compilation était minime.

En Java et C #, les identifiants sont reconnus automatiquement à partir des fichiers source et lire directement à partir des symboles de bibliothèque dynamique. Dans ces langues, les fichiers d'en-tête ne sont pas nécessaires pour la même raison.

référence vers l'avant est le contraire. Il fait référence à l'utilisation d'une entité avant sa déclaration. Par exemple:

int first(int x) {
   if (x == 0) return 1;
   return second(x-1); // forward reference to second
}

int second(int x) {
   if (x == 0) return 0;
   return first(x-1);
}

Notez que « référence avant » est parfois utilisé, bien que moins souvent, comme synonyme de « déclaration anticipée ».

déclarations à terme sont utilisés pour permettre la compilation d'un seul passage d'une langue (C, Pascal).

si les références à terme sont autorisés sans déclaration avant (Java, C #), un compilateur en deux passes est nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top