A Biblioteca C GNU/Usando a biblioteca

Arquivos de Cabeçalho

editar

As bibliotecas para uso em programas escritos em C consistem em duas partes: arquivos de cabeçalho que definem tipos e macros e declaram variáveis e funçõess; e a verdadeira biblioteca ou arquivo que contém as definições das variáveis e funções.

(Lembre-se que em C, uma declaração apenas fornece informações que a variável ou função existe e informa o seu tipo. Para a declaração de funções, informações sobre os tipos de seus argumentos devem ser fornecidas também. O propósito da declaração é permitir que o compilador processe corretamente referências para as variáveis e funções declaradas. Uma definição, por outro lado, aloca espaço suficiente para as variáveis ou diz o que uma função faz.) Para usar as facilidades da biblioteca C GNU, você deve ter certeza que o código-fonte de seus programas contenha arquivos de cabeçalho apropriados. Com isso, o compilador terá as declarações destas facilidades e pode processar corretamente referências para eles.Uma vez que seu programa tenha sido compilado, o linkador substitui estas referências pelas definições verdadeiras fornecidas pelo arquivo armazenado.

Compiladores são incluídos na fonte de um programa através da diretiva de pré-processamento #include. A linguagem C suporta duas formas diferentes desta diretiva; a primeira,

#include "cabeçalho"

é normalmente usada quando o arquivo de cabeçalho é escrito por você; e contém definições e declarações descrevendo as interfaces entre diferentes partes de sua aplicação particular. Em contraste,

#include <cabeçalho>

é normalmente usado para incluir um cabeçalho arquivo.h que contém certas declarações e definições para uma biblioteca padrão. Este arquivo normalmente estará instalado em um local padrão pelo seu administrador de sistema. Você deve usar a seguinte forma para os cabeçalhos fornecidos pela biblioteca C GNU.

Normalmente, diretivas #include são posicionadas no topo do código de um programa, antes de qualquer outro código. Se você começar o seu código com algum comentário explicando o que ele faz (uma boa idéia), coloque as diretivas #include imediatamente depois. Só depois de inserir a diretiva, coloque as macros de definição para testes.

A biblioteca C GNU fornece vários arquivos de cabeçalho, os quais contém definições de tipo e de macros, além de declarações de variáveis e funções para um grupo de facilidades relacionadas. Isso significa que o seu programa pode precisar que vários arquivos de cabeçalho sejam inclusos, dependendo de quais facilidades você esteja usando.

Alguns arquivos de cabeçalho da biblioteca incluem outros arquivos de cabeçalho automaticamente. Entretanto, para manter um estilo de programação consistente, você não deve contar com isso; é melhor explicitar #includes para todos os arquivos de cabeçalho necessários para as facilidades que você está usando. Os arquivos de cabeçalho da biblioteca C GNU foram escritos de forma que não importa se um arquivo de cabeçalho é incluso mais de uma vez por acidente; incluir o mesmo arquivo de cabeçalho duas vezes não tem efeito nenhum. Da mesma forma, a ordem com a qual os arquivos são incluídos também não importa.

Nota de Compatibilidade: A inclusão de arquivos de cabeçalho padrão em qualquer ordem e número de vezes funciona em qualquer implementação do C padrão ISO. Entretanto, isso pode não ser verdade em implementações antigas de C.

Na verdade, você não tem que incluir um arquivo de cabeçalho para usar uma função que ele declara; você mesmo pode declarar a função explicitamente, de acordo com as especificações deste livro. Mas geralmente é melhor incluir o arquivo de cabeçalho, pois ele pode definir tipos e macros que não estão disponíveis de outra forma. Além disso, arquivos de cabeçalho definem substituição de macros de modo mais eficiente para algumas funções. E agindo deste modo, você tem certeza de que seu código terá a declaração correta.

Definições de Macros de Funções

editar

Se nós descrevermos algo como uma função neste livro, ela também pode ter uma definição de macro. Isto normalmente não tem nenhum efeito no modo com que o seu programa funciona. Os equivalentes em macros das funções de biblioteca avaliam os argumentos exatamente uma vez, do mesmo modo que uma chamada de função faria. A principal razão para estas definições de macro é que algumas vezes eles podem produzir expansões nas linhas que são consideravelmente mais rápidos do que seria uma função de verdade.

A coleta do endereço de uma função de biblioteca funciona mesmo que ela seja definida como macro. Isso ocorre porque, neste contexto, o nome da função não é seguido pelo parênteses esquerdo que é sintaticamente necessário para reconhecer uma chamada a uma macro.

Você ocasionalmente pode querer evitar usar uma definição de macro para uma função. Talvez para tornar o seu programa mais fácil de depurar.Existem duas formas de fazer isso:

  • Você pode evitar uma definição de macro em uma ocasião específica ao fechar o nome da função entre parênteses. Desta forma, o nome da função não aparece em um contexto sintático onde é reconhecido como uma chamada a macro.
  • Você pode suprimir qualquer definição de macro de um arquivo de código-fonte inteiro usando a diretiva de pré-processamento "#undef", a menos que isso seja desaconselhado na descrição da facilidade em questão.

Por exemplo, suponha que o arquivo de cabeçalho stdlib.h declare uma função chamada abs com

extern int abs (int);

e também forneça uma definição de macro para abs. Então em:

#include <stdlib.h>
     int f (int *i) { return abs (++*i); }

a referência para abs pode se referir tanto à macro quanto à função. Por outro lado, em cada um dos seguintes exemplos a referência é para uma função, e não para um macro.

#include <stdlib.h>
    int g (int *i) { return (abs) (++*i); }
    #undef abs
    int h (int *i) { return abs (++*i); }

Como definições de macro duplicam o funcionamento da função do mesmo modo que a verdadeira versão da função, geralmente não há necessidade para qualquer um destes métodos. De fato, remover definições de macro geralmente só deixam o seu programa mais lento.

Nomes Reservados

editar

Os nomes de todos os tipos, macros, variáveis e funções da biblioteca que vem com o padrão ISO C são reservadas incondicionalmente; seu programa não pode redefinir estes nomes. Todos os outros nomes da biblioteca são reservados se o seu programa incluir explicitamente o arquivo de cabeçalho que os define ou os declara. Existem várias razões para esta restrição:

  • Outras pessoas que estiverem lendo o seu código podem ficar confusas se você estiver usando a função chamada exit para fazer algo diferente do que o exit padrão faz. Prevenir esta situação torna os seus programas mais fáceis de entender e contribui com a modularidade e a facilidade de manutenção.
  • Isso evita a possibilidade do usuário acidentalmente redefinir uma função de biblioteca que é usada por outras funções de biblioteca.Se a redefinição fôsse permitida, estas outras funções poderiam não funcionar.
  • Isso permite ao compilador fazer qualquer otimização especial necessária ao chamar estas funções, sem a possibilidade delas serem redefinidas pelo usuário. Algumas facilidades da biblioteca, como aquelas funções que lidam com números variáveis de argumentos e saídas não-locais. Tais recursos precisam de uma certa quantia de cooperação entre as partes do compilador C, e respeitando a implementação, é mais fácil para o compilador tratar tais recursos como partes da linguagem.

Além dos nomes documentados neste manual, nomes reservados incluem todos os identificadores externos (funções e variáveis globais) que começam com underline ('_') e todos os identificadores, não importa o uso, que começam com dois underlines ou um underline seguido por uma letra maiúscula. Desta forma, a biblioteca e os arquivos de cabeçalho podem definir funções, variáveis, e macros para propósitos internos sem o risco de entrar em conflito com os nomes nos programas do usuário.

Algumas classes de nomes de identificadores adicionais são reservadas para futuras extensões da linguagem C ou do ambiente POSIX. Ao usar estes nomes em seus programas atualmente, pode não causar nenhum problema; entretanto, evite usar tais nomes, pois podem entrar em conflito com versões futuras dos padrões C e POSIX.

  • Nomes começados com a letra maiúscula 'E' seguida por um dígito ou outra letra maiúscula podem ser usados por nomes de códigos de erros adicionais.
  • Nomes que começam tanto com 'is' ou 'to' seguidos por uma letra minúscula podem ser usadas por funções de conversão e teste de caracteres.
  • Nomes começados com 'LC_', seguidos por uma letra maiúscula podem ser usados por macros adicionais especificando atributos dda região do usuário.
  • Nomes de todas as funções matemáticas existentes sufixadas com 'f' ou 'l' são reservados para funções correspondentes que operam em argumentos de ponto flutuante simples e pontos flutuantes de precisão dupla, respectivamente.
  • Nomes que começam com 'SIG' seguidos de uma letra maiúscula são reservados para nomes de sinais adicionais.
  • Nomes que começam com SIG_' seguidos por uma letra maiúscula são reservados para ações de sinais adicionais.
  • Nomes começados com 'str', 'mem', ou 'wcs' seguidos de uma letra minúscula são reservados para funções de strings e vetores adicionais.
  • Nomes que terminam com '_t' são reservados para nomes de tipos adicionais.

Além disso, alguns arquivos de cabeçalho individuais reservam nomes além daqueles que elas definem. Você só tem que se preocupar com estas restrições se seu programa incluir alguns destes arquivos de cabeçalho:

  • O arquivo de cabeçalho dirent.h reserva nomes começados com `d_'.
  • O arquivo de cabeçalho fcntl.h reservam nomes começados com `l_', `F_', `O_', e `S_'.
  • O arquivo de cabeçalho grp.h reserva nomes começados com `gr_'.
  • O arquivo de cabeçalho limits.h reserva nomes terminados com `_MAX'.
  • O arquivo de cabeçalho pwd.h reserva nomes começados com `pw_'.
  • O arquivo de cabeçalho signal.h reserva nomes começados com `sa_' and `SA_'.
  • O arquivo de cabeçalho sys/stat.h reserva nomes começados com `st_' and `S_'.
  • O arquivo de cabeçalho sys/times.h reserva nomes começados com `tms_'.
  • O arquivo de cabeçalho termios.h reserva nomes começados com `c_', `V', `I', `O', e `TC'; e nomes terminados com `B' seguido por um dígito.