Você está importando um texto. O que o compilador faz é simplificadamente o mesmo que você copiar e colar o texto que está dentro do include para dentro do texto que está no fonte principal.
Para localizar os arquivos de origem que podem ser incluídos, o pré-processador primeiro pesquisa nos diretórios especificados pela opção do compilador /I
. Se a opção /I
não estiver presente ou falhar, o pré-processador usará a variável de ambiente INCLUDE
para localizar os arquivos de inclusão entre colchetes angulares. A variável de ambiente INCLUDE
e a opção do compilador /I
podem conter vários caminhos separados por ponto-e-vírgula (;
). Se mais de um diretório aparecer como parte da opção /I
ou dentro da variável de ambiente INCLUDE
, o pré-processador procurará por eles na ordem em que aparecem.
Note que em C++ é comum usar .hpp
, embora muito programador não o faça até para tentar reutilizar em C. O que daria também com ambas extensões. Eu prefiro usar .hpp
para deixar claro que aquele código foi escrito em C++.
Vou considerar que este é só um exemplo, porque não faz o menor sentido usar #include "Header.h"
no código principal. Ele está incluindo algo que não é necessário.
Quando a função main() chama (invoca) outra função, o programa “salta” para o trecho de código da função que foi chamada, executa esta função e depois retorna novamente para a função principal main().
Vai ser substituída pelo conteúdo do arquivo stdio.h
em um diretório específico da sua máquina (no caso do Ubuntu, provavelmente é /usr/local/include/
, mas pode ser diferente).
No seu caso, você pode ver que utilizou duas funções: printf()
e pow()
. As declarações das funções são as seguintes:
O aninhamento dos arquivos de inclusão pode continuar até 10 níveis. Quando o #include
aninhado for processado, o pré-processador continuará a inserir o arquivo de inclusão delimitador pai no arquivo de origem original.
Portanto, sim, é necessário o acréscimo de #include
em todos os arquivos que façam uso de funções, macros, variáveis e estruturas de dados de um outro arquivo em C.
Ele está importando todo seu conteúdo. Normalmente esse conteúdo são apenas declarações de estruturas de dados (classes, estruturas, enumerações), constantes, cabeçalho de funções/métodos, macros e eventualmente algum código quando se deseja que uma função seja importada direto no fonte ao invés de ser chamada (source inline). O mais comum é ele não ter código. Normalmente ele é usado para declarar as estruturas de dados mas não definir os algoritmos.
O pré-processador para de pesquisar assim que encontra um arquivo com o nome especificado. Se você delimitar uma especificação de caminho completa e não ambígua para o arquivo de inclusão entre aspas duplas (" "
), o pré-processador pesquisará apenas essa especificação de caminho e ignorará os diretórios padrão.
Ou seja, quando uma função requisita um valor
de uma variável, é como se internamente ele recriasse as variáveis que passamos, só que em um escopo próprio. Dessa maneira, as variáveis que passamos como argumento são desprezadas, e as variáveis do escopo da função são utilizadas.
É possível organizar definições de constante e de macro em arquivos de inclusão (também conhecidos como arquivos de cabeçalho) e, em seguida, usar diretivas #include
para adicionar essas definições a qualquer arquivo de origem. Os arquivos de inclusão também são úteis para incorporar declarações de variáveis externas e tipos de dados complexos. Os tipos podem ser definidos e nomeados somente uma vez em um arquivo de inclusão criado para essa finalidade.
Você está importando um texto. O que o compilador faz é simplificadamente o mesmo que você copiar e colar o texto que está dentro do include para dentro do texto que está no fonte principal.
Se você invoca funções da biblioteca padrão C sem carregar os cabeçalhos correspondentes, a invocação pode funcionar se a função em questão não pedir como parâmetro ou retornar nenhum valor, tipo ou global definida no cabeçalho. Conforme os programas vão aumentando de complexidade, a probabilidade de isso acontecer tende a zero.
O path-spec é um nome de arquivo que pode, opcionalmente, ser precedido por uma especificação de diretório. O nome do arquivo deve nomear um arquivo existente. A sintaxe do path-spec depende do sistema operacional em que o programa é compilado.