# Biblioteca padrão do C

A biblioteca padrão do C (também conhecida como libc) é uma biblioteca de rotinas padronizada da linguagem de programação C que contém operações comuns como tratamento de entrada/saída e cadeia de caracteres. Diferente de outras linguagens como COBOL, Fortran e PL/I, C não inclui palavras-chave nativas para tais tarefas, de forma que praticamente todos os programas C fazem uso da biblioteca padrão.

## Estrutura

O nome e as características de cada função estão em um arquivo chamado cabeçalho, mas a implementação das funções está em um arquivo separado. A nomenclatura e o escopo dos cabeçalhos é comum a diferentes implementações, mas a organização das bibliotecas diverge. Cada compilador C possui sua implementação da biblioteca padrão C. Como os compiladores C geralmente oferecem funcionalidades adicionais que não são especificadas pelo ANSI C, a implementação da biblioteca padrão de um compilador é muito provavelmente incompatível com a de outro.

### Qualidade

A maior parte da biblioteca padrão se mostrou ter sido bem desenvolvida. Entretanto, algumas partes são atualmente consideradas erros de modelagem. Por exemplo, as funções de entrada de texto gets e scanf (esta, para ler entrada de texto) são consideradas a fonte de diversos problemas de buffer overflow, e seu uso é desaconselhado. Outra fraqueza é strtok, uma função que visa servir como um analisador léxico primitivo, mas que é "frágil" e difícil de usar.

## História

Antes de ser padronizada, a linguagem C não fornecia funcionalidades nativas como operações de entrada e saída, diferente de outras linguagens tradicionais como Cobol e Fortran. Com o tempo, a comunidade de usuários compartilhou idéias e implementações do que é atualmente chamado biblioteca padrão.
Tanto o Unix quanto a linguagem C foram criados no Bell Labs entre o final da década de 1960 e o início da década de 1970. Durante a década de 1970 a linguagem C tornou-se cada vez mais popular, e diferentes universidades e organizações estavam criando suas próprias variações da linguagem para seus projetos. A partir da década de 1980, os problemas de compatibilidade por conta dessas diferentes versões se tornou cada vez mais aparente. Em 1983 a ANSI formou um comitê para estabelecer uma especificação formal da linguagem conhecida como ANSI C. Esse trabalho culminou na criação padrão C89 em 1989. Parte do padrão que havia surgido era um conjunto de bibliotecas chamado biblioteca padrão do ANSI C.
Revisões posteriores do padrão da linguagem C adicionaram diversos novos cabeçalhos e funcionalidades à biblioteca padrão. Entretanto, o suporte para essas novas extensões variam entre implementações.
Os cabeçalhos <iso646.h>, <wchar.h> e <wctype.h> foram adicionados com o Normative Addendum 1 (NA1), uma ratificação de 1995. Já os cabeçalhos <complex.h>, <fenv.h>, <inttypes.h>, <stdbool.h>, <stdint.h> e <tgmath.h> foram adicionados com o C99, uma revisão do padrão publicada em 1999.

## Padrão ANSI

A biblioteca padrão ANSI C consiste de 24 cabeçalhos, cada um contendo uma ou mais declarações de funções, tipos de dados e macros. Em comparação com linguagens como Java, esta biblioteca padrão é minúscula. Ela fornece um conjunto básico de operações matemáticas, manipulação de cadeias de caracteres, conversão de tipos de dados e entrada e saída de arquivo e da tela. Não contém um conjunto padrão de containers como a biblioteca padrão do C++ (parte chamada Standard Template Library), nem suporta interface gráfica do utilizador. A vantagem desse sistema minimalista é que fornecer um ambiente funcional de ANSI C é muito mais simples que em outras linguagens, e, conseqüentemente, a portabilidade de C entre diferentes plataformas é uma tarefa relativamente simples.
Várias outras bibliotecas foram desenvolvidas para suprir as necessidades computacionais que a biblioteca padrão não cobre. Por exemplo, o projeto GNOME desenvolveu o toolkit GTK+ e a GLib, uma biblioteca de containers.

### Cabeçalhos do ANSI C

| | Descrição | Disponibilidade a partir de |
| <assert.h> | Macro para ajudar na detecção de erros lógicos e outros tipos de erros em versões de depuração de um programa. | |
| <complex.h> | Conjunto de funções para manipular números complexos. | C99 |
| <ctype.h> | Funções usadas para classificar caracteres pelo tipo ou para converter entre caixa alta e baixa independentemente da codificação. | |
| <errno.h> | Teste de códigos de erro reportados pelas funções de bibliotecas. | |
| <fenv.h> | Controle de ponto flutuante. | C99 |
| <float.h> | Constantes de propriedades específicas de implementação da biblioteca de ponto flutuante, como a menor diferença entre dois números de ponto flutuante distintos (_EPSILON), a quantidade máxima de dígitos de acurácia (_DIG) e a faixa de números que pode ser representada (_MIN, _MAX). | |
| <inttypes.h> | Conversão precisa entre tipos inteiros. | C99 |
| <iso646.h> | Programação na codificação de caracteres ISO 646. | NA1 |
| <limits.h> | Constantes de propriedades específicas de implementação da biblioteca de tipos inteiros, como a faixa de números que pode ser representada (_MIN, _MAX). | |
| <locale.h> | Constantes para setlocale e assuntos relacionados. | |
| <math.h> | Funções matemáticas comuns em computação. | |
| <setjmp.h> | Macros setjmp e longjmp, para saídas não locais. | |
| <signal.h> | Tratamento de sinais. | |
| <stdarg.h> | Acesso dos argumentos passados para funções com parâmetro variável. | |
| <stdbool.h> | Definição do tipo de dado booleano. | C99 |
| <stdint.h> | Definição de tipos de dados inteiros. | C99 |
| <stddef.h> | Diversos tipos e macros úteis. | |
| <stdio.h> | Manipulação de entrada/saída. | |
| <stdlib.h> | Diversas operações, incluindo conversão, geração de números pseudo-aleatórios, alocação de memória, controle de processo, sinais, busca e ordenação. | |
| <string.h> | Tratamento de cadeia de caracteres. | |
| <tgmath.h> | Funções matemáticas. | C99 |
| <time.h> | Conversão de tipos de dado de data e horário. | |
| <wchar.h> | Manipulação de caractere wide, usado para suportar diversas línguas. | NA1 |
| <wctype.h> | Classificação de caracteres wide. | NA1 |

## Biblioteca padrão do C em outras linguagens

Algumas linguagens incluem a funcionalidade da biblioteca padrão do C em suas próprias bibliotecas. A biblioteca pode ser adaptada para se adequar melhor à estrutura da linguagem destino, mas a semântica permanece a mesma. Por exemplo, C++ inclui a funcionalidade da biblioteca padrão ANSI C no espaço de nomes std (como std::printf, std::atoi, std::feof, etc.), em cabeçalhos parecidos com os do C, exceto pela retirada do sufixo ".h" e pela adição do prefixo "c" ("cstdio", "cmath", "cstdlib", etc.). Outras linguagens que também adotam abordagens similares incluem D, Python e Go. Um caso curioso das linguagens Rust e Zig, é a possibilidade de automaticamente traduzir o código C para essas linguagens utilizando algumas ferramentas próprias como bindgen-rs vinculado ao gerenciador de projeto cargo e o zig translate-c ao fazer uso da palavra-chave @cImport(@cInclude("stdio.h")) durante a compilação ou simplesmente passar os parametros em ambas ferramentas, contendo também o arquivo .c.

## Implementações

* GNU C Library (glibc)
* Microsoft C Run-time Library
* Musl, uma pequena implementação para sistema embarcado Linux, sendo bastante simples e limpa.
* dietlibc, uma pequena implementação alternativa
* uClibc, uma implementação para sistema embarcado Linux (sem MMU)
* Newlib, uma implementação para sistema embarcado Linux (sem MMU)
* klibc, para o boot de sistemas Linux
* EGLIBC, variante da glibc para sistemas embarcados