Pergunta

Está tudo no título;super-simples, eu acho, mas é tão difícil procurar sintática coisas em qualquer lugar.

Estes são dois arquivos de biblioteca que eu estou copiando a partir de CS50.net, e eu estou querendo saber por que eles possuem duas extensões diferentes.

Foi útil?

Solução

.c :c arquivo (onde a ação real é, em geral)

.h :arquivo de cabeçalho (para ser incluído com um pré-processador #include directiva).Contém material que é normalmente considerado para ser compartilhada com outras partes de seu código, como protótipos de função, #define tinha material, externo declaração de variáveis globais (oh, o horror) e similares.

Tecnicamente, você poderia colocar tudo em um único arquivo.Todo programa em C.milhões de linhas.Mas nós, seres humanos, tendemos a organizar as coisas.Assim, você cria diferentes C ficheiros, cada um com funções específicas.Isso é tudo limpo e agradável.Então, de repente, você percebe que um declaração você tem em um determinado arquivo C deve existir também em outro arquivo C.Então, você gostaria de repetí-los.O melhor é, portanto, para extrair a declaração e colocá-lo em um arquivo comum, que é o .h

Por exemplo, no cs50.h-lhe encontrar os que são chamados de "encaminhar declarações" de suas funções.Uma encaminhar declaração é uma forma rápida para dizer ao compilador como uma função deve ser chamada (por exemplo,que a entrada params) e o que ele retorna, então, ele pode executar a verificação correcta (por exemplo, se você chamar uma função com o número errado de parâmetros, ele vai reclamar).

Outro exemplo.Suponha que escrever um .c arquivo que contém uma função de realização de expressões regulares.Você quer que sua função para aceitar a expressão regular, a seqüência de partida, e um parâmetro que indica se a comparação tem que ser sensível a maiúsculas e minúsculas.

no .c você vai, portanto, colocar

bool matches(string regexp, string s, int flags) { the code }

Agora, suponha que você deseja passar os sinalizadores a seguir:

0:se a procura é sensível a maiúsculas e minúsculas

1:se a procura é sensível a maiúsculas e minúsculas

E você quer manter-se aberto a novas bandeiras, para que você não coloque um valor booleano.brincando com números é difícil, então você definir o útil de nomes para essas bandeiras

#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1

Esta informação vai para o .h, porque se qualquer programa quer usar esses rótulos, ele não tem nenhuma maneira de saber-los a menos que você inclua informações.É claro que você pode colocá-los em .c, mas, em seguida, você teria que incluir o .código c (toda!) o que é um desperdício de tempo e uma fonte de problemas.

Outras dicas

Claro, não há nada que diga que a extensão de um arquivo de cabeçalho deve ser .h e a extensão de um arquivo de origem C deve ser .c. Essas são convenções úteis.

E:\Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif

E:\Temp> type my.source
#include <stdio.h>

#include "my.interface"

int main(void) {
    char x[MYBUFFERSIZE] = {0};
    x[0] = 'a';
    puts(x);
    return 0;
}

E:\Temp> gcc -x c my.source -o my.exe

E:\Temp> my
a

Eles realmente não são arquivos de biblioteca.Eles são apenas arquivos de origem.Como Stefano disse, o .c arquivo é o arquivo de origem C que realmente usa/define a fonte real do que é apenas esboçado na .h arquivo, o arquivo de cabeçalho.O arquivo de cabeçalho normalmente descreve todos os protótipos de função e estruturas que serão utilizadas em reais arquivo de origem.Pense nisso como uma referência/apêndice.Isto é evidente em olhar para o arquivo de cabeçalho, como você vai ver :) então, quando você quer usar algo que foi escrito nesses arquivos de origem, você #include o arquivo de cabeçalho, que contém as informações que o compilador precisa saber.

O .C é o arquivo de origem e .h é o arquivo de cabeçalho.

A .c arquivos são arquivos de origem que será compilado.A .h arquivos são usados para expor a API de um programa para outro programa ou outro programa é que você está a criação de uma biblioteca.

Por exemplo, o programa PizzaDelivery poderia ter 1 .c arquivo com o programa principal, e 1 .c arquivo com funções de utilidade.Agora, para a parte principal do programa para ser capaz de usar as funções de utilitário, você precisa expor o API, através de protótipo de função, em um .h ficheiro, este .h arquivo a ser incluído pelo principal .c arquivo.

.c : 'C' source code
.h : Header file

Geralmente, o .c Os arquivos contêm a implementação e .h Os arquivos contêm a "interface" de uma implementação.

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