Pergunta

Eu não entendo muito bem o ponto de ter um cabeçalho; parece violar o princípio de DRY! Toda a informação em um cabeçalho é (pode ser) contido na implementação.

Foi útil?

Solução

Ele simplifica o processo de compilação. Quando você quer compilar unidades de forma independente, você precisa de algo para descrever as peças que serão ligadas a sem ter que importar a totalidade de todos os outros arquivos.

Ele também permite esconder código. Pode-se distribuir um cabeçalho para permitir que outros usem a funcionalidade sem ter que distribuir a aplicação.

Finalmente, pode incentivar a separação de interface da implementação.

Eles não são a única maneira de resolver estes problemas, mas 30 anos atrás, eles eram uma boa. Nós provavelmente não iria usar arquivos de cabeçalho para uma linguagem de hoje, mas eles não foram inventados em 2009.

Outras dicas

Os arquitetos de muitas línguas modernas, como Java, Eiffel e C # concordam claramente com você - esses idiomas extrair os metadados sobre um módulo da implementação. No entanto, por si só, o conceito de cabeçalhos não impede que - seria obviamente uma tarefa simples para um compilador para extrair um arquivo .h ao compilar um .c, por exemplo, assim como os compiladores para essas outras línguas fazem implicitamente. O fato de que os compiladores típicos atuais C não fazê-lo não é uma questão de design linguagem - é um problema de implementação; Aparentemente não há nenhuma demanda dos usuários para tal característica um, por isso não incomoda fornecedores compilador implementá-lo.

Como uma escolha design de linguagem, tendo arquivos .h separados (em um formato de texto legível e editável) dá-lhe o melhor dos dois mundos: você pode começar a compilar separadamente código de cliente baseado em uma implementação de módulo que ainda não existe , se desejar, escrevendo o arquivo .h à mão; ou você (assumindo por absurdo a implementação do compilador que o fornece ;-) pode obter o arquivo .h automaticamente a partir da implementação como um efeito colateral de compilá-lo.

Se C, C ++, & c, manter próspera (aparentemente eles ainda estão fazendo muito bem hoje ;-), ea demanda como o seu para não escrever cabeçalhos manualmente cresce, eventualmente, escritores compilador terá que fornecer a opção "geração de cabeçalho", e o "melhor dos dois mundos" não vai ficar teórica -!)

Ela ajuda a pensar um pouco sobre as capacidades dos computadores que estavam disponíveis quando, digamos c, foi escrito. A memória principal foi medido em kilowords, e não necessariamente muito muitos deles. Discos eram maiores, mas não muito. armazenamento Serrious significava fitas reel-to-reel, montado à mão, por operadores mal humorado, que realmente queria que você vá embora para que eles pudessem jogar caçar o wumpus. Uma máquina de 1 MIPS era gritando rápido . E com todas essas limitações que você teve que compartilhamento -lo. Possivelmente com uma pontuação de outros usuários.

Tudo o que reduziu o espaço ou complexidade de tempo de compilação foi uma grande vitória. E cabeçalhos de fazer as duas coisas.

Não se esqueça da documentação um cabeçalho fornece. Geralmente, há qualquer coisa nele que você precisa saber para usar o módulo. Eu, pela minha parte não quer fazer a varredura através de um código fonte looong para aprender o que há é que eu preciso para usar e como chamá-lo ... Você poderia extrair essas informações de qualquer maneira, o que efetivamente resulta em - um arquivo de cabeçalho. Não é mais um problema com IDEs modernas, é claro, mas trabalhando com algum código antigo C Eu realmente adoraria ter arquivos de cabeçalho artesanais que incluem comentários sobre o uso e cerca de pré e pós-condições.

Manter fonte, cabeçalho e documentação adicional em sincronia ainda uma outra lata de vermes ...

A idéia de inspecionar os arquivos de saída binários de processadores de linguagem teria sido difícil de compreender quando C inventado arquivos .h. Havia um sistema chamado JOVIAL que fez algo parecido, mas era exótico e confinado mais- ou menos exclusivamente a projetos militares. (Eu nunca vi um programa Jovial, eu só ouvi sobre isso.)

Assim, quando C saiu do padrão de projeto comum para a modularidade foi "nenhuma verificação de que seja". Pode haver uma restrição que os símbolos .text só podiam conectar-se a .text e .data para .data, mas foi isso. Ou seja, os compiladores do dia tipicamente processados ??um arquivo de origem de cada vez e, em seguida, os ligantes colocá-los juntos sem o menor nível de verificação de erros que não, se você teve sorte, "eu sou um símbolo da função" vs "Eu sou um símbolo de dados".

Assim, a idéia de realmente ter o compilador entender a coisa que você estava chamando era um pouco novo.

Mesmo hoje em dia, se você fizer um cabeçalho totalmente falso, ninguém pega na maioria AOT compiladores . coisas inteligentes como linguagens CLR e Java realmente fazer coisas codificar nos arquivos de classe.

Então, sim, a longo prazo, nós provavelmente não terá arquivos de cabeçalho.

Não, você não tem cabeçalhos em Java -. Mas você tem as interfaces e eu cada sério guru Java recomenda que você definir qualquer coisa usada por outros projetos / sistemas como uma interface e uma implementação

Vamos ver uma interface java definição contém assinaturas de chamadas, definições de tipo e contants.

A maioria dos arquivos de cabeçalho C contêm assinaturas de chamadas, definições de tipo e constantes.

Assim, para todos os efeitos práticos arquivos de cabeçalho C / C ++ são apenas interface de definições e devem, portanto, ser considerado uma coisa boa. Agora eu sei que é possível definir uma miríade de outras coisas em arquivos de cabeçalho, bem como (MARCROs, constantes etc. etc.) mas essa parte apenas de todo o mundo maravilhoso de C: -

int function target () {
    // Default for shoot
    return FOOT;
}

Para Detalhe Leia este

Um arquivo de cabeçalho contém normalmente declarações para a frente de classes, sub-rotinas, variáveis ??e outros identificadores. Os programadores que desejam declarar identificadores padronizados em mais de um arquivo de origem pode colocar tais identificadores em um único arquivo de cabeçalho, que outro código, em seguida, pode incluir, sempre que são necessários o conteúdo de cabeçalho.

A biblioteca padrão C e biblioteca padrão C ++ tradicionalmente declarar suas funções padrão em arquivos de cabeçalho.

E se você quiser dar a alguém as declarações de usar sua biblioteca sem lhes dar a implementação?

Como outra resposta pontos fora - a razão original para cabeçalhos era fazer o parse / compilar mais fácil em plataformas com ferramentas muito simples e limitado. Foi um grande passo em frente para ter uma máquina com 2 disquetes para que pudesse ter o compilador em um e seu código nos outros -. Feitas coisas muito mais fácil

Quando você dividir o código em arquivos de inclusão e de código você dividir declaração e definição. Quando você olha em arquivos de cabeçalho você pode ver o que você tem e se você varinha para ver detalhes de implementação de ir para a arquivo de origem.

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