Pregunta

Im un poco confundido. ¿Cuál es la diferencia entre la declaración de referencia hacia delante y hacia adelante? declaración adelantada es, en mi cabeza, cuando se declara una función que isnt aún implementado, pero esto es incorrecto? ¿Tiene que ver la situación especificada, ya sea para declarar un caso de "referencia hacia delante" o "declaración hacia adelante"?

¿Fue útil?

Solución

Wikipedia :

  

Declaración hacia delante

     

Declaración de una variable o función que no están definidos todavía. Su defnición puede verse más adelante.

     

Reenviar referencia

     

Al igual que en adelante Declaración pero donde aparece la variable o función primera la definición es también en su lugar.

Otros consejos

declaración adelantada es la declaración de un método o variable antes de implementar y utilizar. El propósito de declaraciones adelantadas es ahorrar tiempo de compilación.

La declaración adelantada de una variable hace que el espacio de almacenamiento que haya que retirar, por lo que más tarde puede establecer el valor de esa variable.

La declaración adelantada de una función también se llama un "prototipo de función", y es un establecimiento de declaraciones que le dice al compilador qué tipo de retorno de una función es, cuál es el nombre de la función es, y los tipos de sus parámetros. Los compiladores de lenguajes como C / C ++ y Pascal tienda declararon símbolos (que incluyen funciones) en una tabla de consulta y hace referencia a ellos, ya que viene a través de ellos en el código. Estos compiladores leer su código de forma secuencial, es decir, de arriba abajo, por lo que si no se declara hacia adelante, el compilador descubre un símbolo que no puede hacer referencia en la tabla de consulta, y se genera un error que no sabe cómo responder a la función.

La declaración hacia adelante es una sugerencia para el compilador que haya definido (llenado la aplicación de) la función en otro lugar.

Por ejemplo:

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

...

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

Sin embargo, puede pedir, ¿por qué no sólo tenemos el compilador hacer dos pases en cada archivo de origen: la primera para indexar todos los símbolos en el interior, y la segunda para analizar las referencias y mirar hacia arriba? Según Dan Historia:

  

Cuando C se creó en 1972, los recursos de computación eran mucho más escasos   y con una prima elevada - La memoria necesaria para almacenar un complejo   toda la tabla simbólica del programa a la vez simplemente no estaba disponible en   la mayoría de los sistemas. almacenamiento fijo también era caro y muy lento, por lo   Ideas como la memoria virtual o partes de almacenamiento de la tabla simbólica en   disco simplemente no habría permitido la compilación de una forma razonable   plazo ... Cuando estás tratando con la cinta magnética, donde los tiempos de búsqueda   se midieron en segundo y leer rendimiento se midió en bytes por   segundos (no kilobytes o megabytes), que era bastante significativa.

     

C ++, mientras que creado casi 17 años más tarde, se definió como un superconjunto   de C, y por lo tanto tuvo que usar el mismo mecanismo.

     

En el momento de Java enrollado alrededor de 1995, las computadoras promedio tenían suficiente   memoria que la celebración de una tabla de símbolos, incluso para un proyecto complejo, era   ya no es una carga sustancial. Y Java no fue diseñado para ser   -Compatible hacia atrás con C, por lo que no tenía necesidad de adoptar un legado   mecanismo. C # fue igualmente sin trabas.

     

Como resultado, sus diseñadores optaron por trasladar el peso de   compartimentar simbólica declaración de marcha atrás y el programador   ponerlo en el equipo de nuevo, ya que su costo en proporción a la   esfuerzo total de la compilación fue mínima.

En Java y C #, identificadores son reconocidos automáticamente de los archivos de origen y se leen directamente de símbolos de biblioteca dinámica. En estos idiomas, archivos de cabecera no son necesarios por la misma razón.

A referencia hacia delante es el opuesto. Se refiere a la utilización de una entidad antes de su declaración. Por ejemplo:

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);
}

Tenga en cuenta que "delantero de referencia" se utiliza a veces, aunque con menos frecuencia, como sinónimo de "declaración hacia adelante."

declaraciones hacia adelante se utilizan para permitir la compilación de un solo paso de una lengua (C, Pascal).

Si se permite referencias hacia delante sin declaración hacia adelante (Java, C #), se requiere un compilador de dos pasos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top