C - Arquivos de cabeçalho

Um arquivo de cabeçalho é um arquivo com extensão .hque contém declarações de função C e definições de macro a serem compartilhadas entre vários arquivos de origem. Existem dois tipos de arquivos de cabeçalho: os arquivos que o programador grava e os arquivos que vêm com o seu compilador.

Você pede para usar um arquivo de cabeçalho em seu programa, incluindo-o com a diretiva de pré-processamento C #include, como você viu a inclusão de stdio.h arquivo de cabeçalho, que vem junto com seu compilador.

Incluir um arquivo de cabeçalho é igual a copiar o conteúdo do arquivo de cabeçalho, mas não o fazemos porque estará sujeito a erros e não é uma boa ideia copiar o conteúdo de um arquivo de cabeçalho nos arquivos de origem, especialmente se nós tem vários arquivos de origem em um programa.

Uma prática simples em programas C ou C ++ é que mantemos todas as constantes, macros, variáveis ​​globais do sistema e protótipos de função nos arquivos de cabeçalho e incluímos esse arquivo de cabeçalho sempre que necessário.

Incluir Sintaxe

Os arquivos de cabeçalho do usuário e do sistema são incluídos usando a diretiva de pré-processamento #include. Possui as duas formas a seguir -

#include <file>

Este formulário é usado para arquivos de cabeçalho do sistema. Ele procura um arquivo denominado 'arquivo' em uma lista padrão de diretórios do sistema. Você pode acrescentar diretórios a esta lista com a opção -I ao compilar seu código-fonte.

#include "file"

Este formulário é usado para arquivos de cabeçalho de seu próprio programa. Ele procura um arquivo chamado 'arquivo' no diretório que contém o arquivo atual. Você pode acrescentar diretórios a esta lista com a opção -I ao compilar seu código-fonte.

Incluir Operação

o #includeA diretiva funciona direcionando o pré-processador C para varrer o arquivo especificado como entrada antes de continuar com o resto do arquivo fonte atual. A saída do pré-processador contém a saída já gerada, seguida pela saída resultante do arquivo incluído, seguida pela saída que vem do texto após o#includediretiva. Por exemplo, se você tiver um arquivo de cabeçalho header.h da seguinte forma -

char *test (void);

e um programa principal chamado program.c que usa o arquivo de cabeçalho, como este -

int x;
#include "header.h"

int main (void) {
   puts (test ());
}

o compilador verá o mesmo fluxo de token que veria se program.c fosse lido.

int x;
char *test (void);

int main (void) {
   puts (test ());
}

Cabeçalhos Únicos

Se um arquivo de cabeçalho for incluído duas vezes, o compilador processará seu conteúdo duas vezes e resultará em um erro. A maneira padrão de evitar isso é encerrar todo o conteúdo real do arquivo em uma condição, como esta -

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

Esta construção é comumente conhecida como wrapper #ifndef. Quando o cabeçalho for incluído novamente, a condicional será falsa, porque HEADER_FILE está definido. O pré-processador pulará todo o conteúdo do arquivo e o compilador não o verá duas vezes.

Inclui Computado

Às vezes, é necessário selecionar um dos vários arquivos de cabeçalho diferentes a serem incluídos em seu programa. Por exemplo, eles podem especificar parâmetros de configuração a serem usados ​​em diferentes tipos de sistemas operacionais. Você poderia fazer isso com uma série de condicionais da seguinte maneira -

#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif

Mas, à medida que cresce, torna-se tedioso; em vez disso, o pré-processador oferece a capacidade de usar uma macro para o nome do cabeçalho. Isso é chamado decomputed include. Em vez de escrever um nome de cabeçalho como o argumento direto de#include, você simplesmente coloca um nome de macro lá -

#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

SYSTEM_H será expandido, e o pré-processador procurará por system_1.h como se o #includetinha sido escrito dessa forma originalmente. SYSTEM_H pode ser definido por seu Makefile com uma opção -D.