Como o #include funciona em C ++?

Eu li de um Blog de Forças de Código que se #include #include em um programa C++ , então não há necessidade de include nenhum outro arquivo de header. como o #include funciona e é #include usá-lo em vez de include arquivos de header individuais?

É basicamente um arquivo de header que também inclui todas as bibliotecas padrão e arquivo de inclusão stl. O único propósito que posso ver para isso seria para testes e educação.

Se, por exemplo, GCC 4.8.0 /bits/stdc++.h source .

Usá-lo includeia muitas coisas desnecessárias e aumentaria o tempo de compilation.

Edit: Como Neil diz, é uma implementação de headers pré-compilados. Se você configurá-lo para pré-compilation corretamente, ele pode, de fato, acelerar o tempo de compilation, dependendo do seu projeto. ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html )

No entanto, sugiro que você reserve algum tempo para aprender sobre cada um dos headers sl / stl e inclua-os separadamente, e não use “superheaders”, exceto para fins de pré-compilation.

#include é um arquivo de implementação para um header pré-compilado.

Do ponto de vista da engenharia de software, é uma boa ideia minimizar a inclusão. Se você usá-lo, na verdade, inclui muitos arquivos, que seu programa pode não precisar, aumentando assim o tempo de compilation e o tamanho do programa desnecessariamente. [edit: como apontado pelo @Swordfish nos comentários que o tamanho do programa de saída permanece inalterado. Mas ainda assim, é uma boa prática include apenas as bibliotecas que você realmente precisa, a menos que seja uma competição competitiva.]

Mas nos concursos, usar esse arquivo é uma boa ideia, quando você quer reduzir o tempo gasto em tarefas domésticas; especialmente quando sua sorting é sensível ao tempo.

Funciona na maioria dos juízes online, em ambientes de concursos de programação, incluindo o ACM-ICPC (Sub-Regionais, Regionais e Finais Mundiais) e muitos juízes online.

As desvantagens disso são que

  • aumenta o tempo de compilation.
  • usa um arquivo de header não-padrão interno da biblioteca GNU C ++ e, portanto, não compilará em MSVC, XCode e muitos outros compiladores

Esse arquivo de header não faz parte do padrão C ++, portanto, não é portátil e deve ser evitado.

Além disso, mesmo se houvesse algum header no padrão, você iria querer evitá-lo em vez de headers específicos, já que o compilador tem que realmente ler e analisar cada header incluído (incluindo headers incluídos recursivamente) toda vez que unidade de tradução é compilada.

Infelizmente essa abordagem não é portátil C ++ (até agora).

Todos os nomes padrão estão no namespace std e, além disso, você não pode saber quais nomes NÃO são definidos por inclusão e header (em outras palavras, é perfeitamente legal que uma implementação declare o nome std::string direta ou indiretamente ao usar #include ) .

Apesar disso, você é obrigado pela linguagem a saber e dizer ao compilador qual header padrão inclui qual parte da biblioteca padrão. Esta é uma fonte de bugs de portabilidade, porque se você esquecer por exemplo #include

mas usar std::map é possível que o programa compile de qualquer maneira silenciosamente e sem avisos em uma versão específica de um compilador específico, e você pode obter apenas erros mais tarde, quando portando para outro compilador ou versão.

Na minha opinião, não há desculpas técnicas válidas porque isso é necessário para o usuário geral: o binário do compilador pode ter todo o namespace padrão embutido e isso pode aumentar o desempenho ainda mais do que headers pré-compilados (por exemplo, usando hashing perfeito para pesquisas, removendo padrões headers de análise ou carregamento / demarshalling e assim por diante).

O uso de headers padrão simplifica a vida de quem constrói compiladores ou bibliotecas padrão e isso é tudo. Não é algo para ajudar os usuários.

No entanto, esta é a maneira como a linguagem é definida e você precisa saber qual header define quais nomes planejam para que alguns neurônios extras sejam queimados em configurações sem sentido para lembrar (ou tente localizar e IDE que adiciona automaticamente os headers padrão que você usa e remove os que você não faz … uma alternativa razoável).

É basicamente um arquivo de header que inclui todas as bibliotecas padrão.
Em concursos de programação , usar esse arquivo é uma boa ideia, quando você deseja reduzir o tempo perdido em tarefas domésticas; especialmente quando sua sorting é sensível ao tempo.
Em concursos de programação , as pessoas se concentram mais em encontrar algoritmos para resolver um problema do que em engenharia de software.
Mas na perspectiva da engenharia de software , não é uma boa ideia usar. Se você usá-lo, na verdade, inclui muitos arquivos, que seu programa pode não precisar, aumenta o tempo de compilation e o tamanho do programa desnecessariamente.