paulo1205
(usa Ubuntu)
Enviado em 02/12/2021 - 15:48h
Não existe “libc original”, pois ninguém é dono do C.
Além de definir aspectos léxicos, gramaticais e de funcionamento básico de construção dos programas, o padrão do C define dois níveis de conformidade de implementações que podem ser criadas a partir dele:
freestanding, que significa que a implementação traz todos os aspectos obrigatórios da linguagem e um conjunto mínimo de bibliotecas a fim de que um programa possa executar num computador mínimo, sem o suporte de um ambiente de execução muito sofisticado ou de um sistema operacional, e
hosted, que traz um conjunto maior de funções, e implica que o programa será executado com o suporte de um ambiente de execução capaz de realizar operações mais sofisticadas, à semelhança de um sistema operacional, incluindo, por exemplo, armazenamento em arquivos, alocação dinâmica de memória, operações mais sofisticadas com
strings etc.
A “biblioteca padrão” do C é o conjunto de todas as funções, tipos de dados, variáveis globais, constantes, enumerações e macros definidos pelo padrão do C para uma implementação
hosted. Esses elementos são descritos pelo padrão mas, exceto no caso de algumas constantes fixas, não são definidos por ele.
Em outras palavras, não existe uma implementação de referência da biblioteca padrão. Cada implementação é livre para criar suas próprias versões de cada um desses elementos, desde que atenda todos os comportamentos descritos para eles.
As implementações podem até estender aquilo que o padrão descreve, particularmente em áreas que o padrão diz que são definidas pela implementação (
implementation-defined) ou deliberadamente indefinidas (
undefined), desde que não entre em contradição com os aspectos sobre os quais ele se manifesta explicitamente.
Um exemplo de extensão é o que acontece com a função
fflush(), cujo comportamento específico é descrito para o padrão apenas para fluxos de saída, mas é indefinido para fluxos de entrada. Implementações no mundo Microsoft (antigo MS-DOS e também Windows) e versões recentes da GlibC têm, obviamente, o comportamento prescrito no padrão para fluxos de saída, mas definem também o comportamento para fluxos de entrada (que é de descartar o que estiver no
buffer de entrada mas ainda não tiver sido consumido pelo programa). A libc de sistemas BSD não traz (ou não trazia, quando eu usava BSD diariamente) esse comportamento, mas, até onde lembro, simplemente ignoravam fluxos de entrada, deixando-os intocados. Embora diferentes, todas essas implementações estão de acordo com o padrão, pois seguem à risca o que é explicitamente descrito, e inovam apenas em áreas em que não há regras definido algo diferente daquilo que tais implementações escolheram fazer (eu até costumo brincar que uma implementação que escolha causar uma explosão termonuclear na sua casa quando você chama a função com um fluxo de entrada também é conforme, desde que faça o que tem de fazer se for chamada com fluxos de saída).
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)