A biblioteca padrão de C agora é uma coleção padronizada de cabeçalhos e rotinas usadas para implementar operações comuns, como entrada / saída e gerenciamento de strings na linguagem C Ao contrário de outras linguagens como Pascal e PL / I , C não inclui palavras - chave para essas tarefas , então quase todos os programas escritos em C usam a biblioteca padrão, mesmo que apenas para exibir um resultado.
O nome e a assinatura (o "protótipo" em C) de cada função são descritos em cabeçalhos que estão incluídos no código-fonte , enquanto o código-objeto das funções é separado em uma biblioteca de software , que estará vinculada apenas ao código-fonte . Resto do programa apenas durante a vinculação . O nome e o namespace dos cabeçalhos se tornaram comuns. Na maioria das vezes, cada cabeçalho é um arquivo separado, mas a organização das implementações permanece diversa. A biblioteca padrão veio originalmente com o compilador , mas hoje geralmente faz parte do sistema operacional . Em sistemas Unix , geralmente é encontrado no diretório /usr/lib/e é nomeado após libc.aou libc.so ; os arquivos de cabeçalho estão no diretório /usr/include. No entanto, o compilador sempre sabe onde esses arquivos estão localizados, portanto, não há necessidade de informá-lo.
No Linux , a biblioteca glibc é geralmente usada; no Windows , geralmente é a biblioteca padrão do Visual C ++ , chamada MSVCR*.dll, porque está disponível independentemente do compilador C usado. Como os compiladores C geralmente oferecem mais funcionalidade do que as especificadas pelos padrões ISO e POSIX C , uma biblioteca padrão fornecida com um compilador específico é pouco compatível com as bibliotecas padrão de outros compiladores para funções que não são padronizadas.
A experiência mostra que a maior parte da biblioteca C padrão foi bem projetada. Algumas partes em retrospectiva, no entanto, parecem ser erros. A função de leitura de linha getse o uso de scanfpara ler strings de entrada são a origem de muitos buffer overflows , e a maioria dos guias de programação recomenda evitar seu uso. Outra antiga strtokfunção é projetada como um analisador léxico primitivo, mas que é bastante "frágil" e difícil de usar. Por fim, a gestão de datas e horas é primitiva, nomeadamente a impossibilidade virtual de gestão de fusos horários.
O Unix e a linguagem de programação C foram criados pelos laboratórios AT&T e Bell (AT&T's Bell Laboratories) no início dos anos 1970 . A linguagem C primitiva não fornecia funcionalidade embutida como operações de E / S (ao contrário de linguagens tradicionais como Pascal e Fortran ). Com o tempo, as comunidades de usuários C compartilharam ideias e implementações do que agora chamamos de Biblioteca Padrão C para fornecer esses recursos. Muitas dessas idéias foram incorporadas à definição padronizada da linguagem de programação C.
Durante a década de 1970, C se tornou popular. Muitas universidades e organizações criaram suas próprias variações dessa linguagem para seus projetos. Na década de 1980, surgiram problemas de compatibilidade entre as diferentes implementações de C.
Em 1983, o American National Standards Institute (ANSI) formou um comitê para estabelecer uma especificação padrão para C, conhecida como "ANSI C". Este trabalho culminou com a criação do padrão C89 em 1989 . Parte do padrão resultante era um conjunto de funções de biblioteca chamado padrão ANSI C biblioteca ( biblioteca padrão ANSI C ). Este padrão se tornou um Padrão Internacional em 1990 e também é conhecido como ISO C (ISO C) .
As revisões posteriores do padrão ISO C adicionaram novas funções e cabeçalhos à biblioteca. O suporte para essas extensões varia de acordo com a implementação. Cabeçalhos <iso646.h>, <wchar.h>e <wctype.h>foi adicionado com a alteração normativa 1 ( normativa Alteração 1 ), daqui em diante abreviado por Amd.1 , que é uma adição ao padrão C ratificado em 1995 . Os cabeçalhos <complex.h>, <fenv.h>, <inttypes.h>, <stdbool.h>, <stdint.h>e <tgmath.h>foram adicionados com C99, uma revisão do padrão C, publicado em 1999 .
A biblioteca padrão ISO C consiste em 24 cabeçalhos que podem ser incluídos em um projeto de programador com uma única diretiva. Cada cabeçalho contém protótipos de função, definições de tipo e macros. O conteúdo desses cabeçalhos é descrito a seguir.
Comparada com outras linguagens (por exemplo, Java ), a biblioteca C padrão ISO é pequena. Ele fornece um conjunto básico de funções matemáticas, manipulação de strings , conversão de tipo e arquivos e funções de entrada / saída de terminal. Não inclui uma base padrão de "tipos de contêiner", como faz a Biblioteca de modelos padrão da linguagem C ++ . Deixa de lado interfaces gráficas de usuário (GUI), ferramentas de rede, funções de sincronização entre tarefas e a profusão de outras funcionalidades que o Java fornece como padrão. A principal vantagem de uma pequena biblioteca padrão é que é muito mais fácil fornecer um ambiente de trabalho para C ISO do que para outras linguagens, e portar aplicativos da linguagem C para novas plataformas é, portanto, relativamente rápido.
Muitas outras bibliotecas foram escritas para desenvolver uma funcionalidade equivalente à fornecida por outras linguagens em sua biblioteca padrão. Por exemplo, o ambiente de desktop proposto GNOME desenvolveu o Box Tools GIMP (GIMP ToolKit, GTK) e GLib , uma biblioteca que contém contêineres de estruturas de dados, e há muitos outros exemplos de propriedade conhecida. Desta variedade de bibliotecas disponíveis, alguns kits de ferramentas mostraram capacidades superiores ao longo do tempo. A principal desvantagem é que muitas vezes eles não funcionam muito bem juntos, os programadores são frequentemente forçados a fazer malabarismos com várias bibliotecas diferentes e alguns recursos podem estar presentes em diferentes formas em cada plataforma específica, às vezes até dentro da mesma.
A linguagem de programação C ++ assume a funcionalidade da biblioteca padrão ISO C, mas faz várias alterações, como transformar os nomes dos cabeçalhos de <xxx.h>em <cxxx>(no entanto, os nomes no estilo C ainda estão disponíveis, embora desatualizados) e coloque todos os identificadores no namespace (namespace) std.