Por que meu stdbool.h não está em / usr / include?

1

Estou acostumado com arquivos de cabeçalho C padrão em /usr/include (por exemplo, stdio.h , stdlib.h , string.h , ctype.h e assim por diante); ainda - stdbool.h não é. Agora, eu sei que é mais novo que o resto, sendo apenas parte do C99. Mas - eu tenho, é só em

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdbool.h
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdbool.h
/usr/lib/gcc/x86_64-linux-gnu/5/include/stdbool.h

um local diferente para cada versão do GCC. Por que é que? É, afinal, um padrão - não é suposto mudar de uma versão do GCC para outra. E, com certeza, não há diferenças reais entre as versões. (*) Por que este é um compilador específico e os outros em todo o sistema?

* - Bem, o aviso de direitos autorais, e alguns ifdef baseados em uma versão CPLUSPLUS para quando é usado com C ++.

    
por einpoklum 16.11.2015 / 21:44

2 respostas

4

It is, after all, a standard - it's not supposed to change from one GCC version to the next.

Não, não é um padrão. O padrão é que você pode escrever

#include <stdbool.h>
em uma unidade de tradução e isso afetará certas coisas. Não há garantia dos padrões de linguagem que os cabeçalhos são arquivos, e muito menos que sejam arquivos em um diretório específico em um sistema de arquivos em seu computador com conteúdo fixo.

O ponto principal de tais cabeçalhos padrão é que eles fazem o que for apropriado para o compilador C / C ++ para fornecer as coisas que os padrões de linguagem dizem que devem fornecer em sua inclusão. Eles fornecem as declarações e macros necessárias (geralmente) usando palavras-chave internas, pragmas, macros e intrínsecos fornecidos pelo compilador. Isso, claro, varia de compilador para compilador.

Qual é o segundo erro que você está fazendo aqui. É um erro míope pensar que o GCC é o único compilador C / C ++. Pessoas com um histórico de programação DOS ou Win32 mais antigo, onde pode haver muitos compiladores, estarão muito familiarizados com a idéia de que os cabeçalhos padrão estão muito ligados ao compilador . Não se pode simplesmente pegar os cabeçalhos padrão (digamos) do Watcom C / C ++ e usá-los com a Borland, Microsoft, IBM ou qualquer outro compilador C / C ++.

Esse é o pensamento a adotar, porque isso também vale para você . Embora o que precisa ser feito em um cabeçalho padrão para atingir sua finalidade possa variar de uma versão do GCC para outra, elas também podem variar entre (digamos) o clang e o GCC. Os sistemas operacionais Unix e Linux não são não monoculturas de um compilador.

E, de fato, você encontrará float.h , limits.h , stdint.h , stddef.h , stdarg.h e vários outros cabeçalhos padrão, todos residindo nesses locais específicos do compilador. limits.h é um assunto particularmente confuso, porque abrange tanto o conhecimento específico do compilador quanto o conhecimento específico da plataforma de destino.

Leitura adicional

por 17.11.2015 / 13:47
2

Em sistemas semelhantes a unix existe uma distinção entre o compilador C (normalmente gcc) e a biblioteca padrão C (normalmente glibc). Ao contrário de muitos outros sistemas operacionais, a biblioteca padrão C em sistemas unix-like também serve como a principal biblioteca de interface OS.

A leitura dos padrões C não o ajudará aqui, pois eles compõem o compilador e a plataforma juntos como uma "implementação".

Alguns cabeçalhos "pertencem" à biblioteca C, já que sua finalidade é fornecer uma interface para a funcionalidade da biblioteca C. Esses cabeçalhos são instalados pela biblioteca C e vão em / usr / include.

Outros cabeçalhos "pertencem" ao compilador C, pois descrevem a funcionalidade do compilador. Como as distribuições normalmente suportam vários compiladores C, elas são colocadas em locais específicos do compilador.

    
por 14.10.2016 / 21:23

Tags