Pergunta

Im um pouco confuso. Qual é a diferença entre a declaração para a frente e de referência para a frente? declaração para a frente é, na minha cabeça, quando você declara uma função que is not implementado ainda, mas isso é incorreta? Você tem que olhar para a situação especificada para qualquer declarando um caso "de referência para a frente" ou "declaração para a frente"?

Foi útil?

Solução

A partir Wikipedia :

Encaminhar Declaração

Declaração de uma variável ou função que ainda não estão definidos. Sua defnição pode ser visto mais tarde.

Encaminhar Referência

Semelhante a Declaração frente, mas em que a variável ou função aparece em primeiro lugar a definição também está no local.

Outras dicas

A declaração para a frente é a declaração de um método ou variável antes de implementar e usar. O propósito das declarações para a frente é para economizar tempo de compilação.

A declaração para a frente de uma variável faz com que o espaço de armazenamento para ser posta de lado, para que possa depois definir o valor dessa variável.

A declaração para a frente de uma função também é chamado de "protótipo função", e é uma instrução de declaração que informa o compilador que tipo de retorno de uma função é, qual é o nome da função é, e os tipos de seus parâmetros. Compiladores em linguagens como C / C ++ e Pascal loja declarou símbolos (que incluem funções) em uma tabela de pesquisa e referências eles como se depara-los em seu código. Estes compiladores ler seu código sequencial, ou seja, de cima para baixo, de modo que se você fizer declarar não para a frente, os descobre compilador um símbolo que não pode referência na tabela de pesquisa, e levanta um erro que ele não sabe como responder para a função.

A declaração para a frente é uma dica para o compilador que você definiu (preenchido a implementação de) a função em outro lugar.

Por exemplo:

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

...

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

Mas, você pergunta, por que não só temos o compilador fazer dois passes em cada arquivo de origem: a primeira para indexar todos os símbolos no interior, eo segundo para analisar as referências e procurá-los? De acordo com Dan História:

Quando C foi criada em 1972, recursos de computação eram muito mais escassos e em um prêmio elevado - a memória necessária para armazenar um complexo Toda a tabela simbólica do programa ao mesmo tempo simplesmente não estava disponível em a maioria dos sistemas. armazenamento fixo também foi caro, e extremamente lento, por isso, idéias como memória virtual ou guardar as partes da tabela simbólica sobre disco simplesmente não teria permitido a compilação em um razoável prazo ... Quando você está lidando com fita magnética, onde os tempos de busca foram medidos em segundos e de transferência de leitura foi medido em bytes por segunda (não kilobytes ou megabytes), que era muito significativa.

C ++, enquanto criado há quase 17 anos mais tarde, foi definida como um super de C, e, portanto, tinha de utilizar o mesmo mecanismo.

No momento em Java rolava em 1995, os computadores médios teve o suficiente memória que realização de uma mesa simbólico, mesmo para um projeto complexo, foi não um fardo substancial. E Java não foi projetado para ser retro-compatível com C, por isso não tinha necessidade de adoptar um legado mecanismo. C # foi igualmente livre.

Como resultado, os designers optaram por transferir o ônus da compartimentar declaração volta simbólica fora do programador e colocá-lo no computador de novo, desde o seu custo em proporção ao esforço total de compilação foi mínima.

Em Java e C #, identificadores são reconhecidos automaticamente a partir de arquivos de origem e ler directamente a partir de símbolos da biblioteca dinâmicas. Em línguas, arquivos de cabeçalho não são necessários para a mesma razão.

A referência para a frente é o oposto. Ele refere-se ao uso de uma entidade antes da sua declaração. Por exemplo:

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

Note que "referência direta" é usado às vezes, embora com menos frequência, como sinónimo de "declaração para a frente."

declarações para a frente são usadas para permitir a compilação de uma única passagem de uma língua (C, Pascal).

Se referências à frente são permitidos sem declaração para a frente (Java, C #), é necessário um compilador de duas passagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top