pre_compilacao
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
— | pre_compilacao [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Pré-Compilação ====== | ||
+ | ===== Fases de uma compilação ===== | ||
+ | |||
+ | {{: | ||
+ | |||
+ | O processo de compilação de um programa é constituído de três fases distintas: | ||
+ | - pré-compilação; | ||
+ | - compilação; | ||
+ | - link-edição. | ||
+ | |||
+ | Na fase de pré-compilação, | ||
+ | |||
+ | O compilador interpreta a linguagem deste fonte intermediário e gera o código objeto, que é um código em assembler, pronto para ser utilizado. | ||
+ | |||
+ | Na fase de link-edição, | ||
+ | |||
+ | ===== Diretiva #include ===== | ||
+ | |||
+ | Sintaxe: | ||
+ | |||
+ | ''# | ||
+ | |||
+ | ''# | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Todos os comandos para o pré-compilador começam com o caractere "''#''" | ||
+ | |||
+ | O arquivo incluído possui o nome de arquivo //header// e geralmente possui protótipo de funções a serem utilizadas por todos os programas de um sistema. Possui também as declarações de tipos existentes ('' | ||
+ | |||
+ | Quando um arquivo //header// pertence ao sistema (ou seja, ao compilador) deve-se colocar o nome dele entre "''<''" | ||
+ | |||
+ | Veja os programas '' | ||
+ | |||
+ | <code c> | ||
+ | /* programa_principal_001.c */ | ||
+ | |||
+ | |||
+ | /* Repare na forma como os arquivos headers foram inseridos. O arquivo header padrão do sistema tem o seu nome | ||
+ | * preenchido entre < > e o arquivo header local tem o seu nome preenchido entre “ “. */ | ||
+ | #include " | ||
+ | #include < | ||
+ | |||
+ | int iValor_a; | ||
+ | int iValor_b; | ||
+ | int main (void) | ||
+ | { | ||
+ | int iResultado; | ||
+ | |||
+ | | ||
+ | scanf ("%d %d", & | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code c> | ||
+ | /* programa_auxiliar_001.c */ | ||
+ | |||
+ | #include < | ||
+ | extern int iValor_a; | ||
+ | extern int iValor_b; | ||
+ | |||
+ | void imprime_soma (void) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code c> | ||
+ | /* soma.h, utilizado por programa_principal_001.c e programa_auxiliar_001.c */ | ||
+ | |||
+ | void imprime_soma(void); | ||
+ | </ | ||
+ | |||
+ | ===== Diretiva #define ===== | ||
+ | Sintaxe: | ||
+ | |||
+ | ''# | ||
+ | |||
+ | ---- | ||
+ | |||
+ | É possível definir [[variavel_definicao|variáveis]] para o pré-compilador, | ||
+ | |||
+ | Cada vez que o pré-compilador encontrar esta [[variavel_definicao|variável]], | ||
+ | |||
+ | **Ressaltando que a definição de uma [[variavel_definicao|variável]] de pré-compilação é pura substituição de caracteres.** | ||
+ | |||
+ | Veja o exemplo: (compile para ver a diferença: '' | ||
+ | |||
+ | <code c> | ||
+ | /* programa_principal_002.c */ | ||
+ | |||
+ | #include < | ||
+ | |||
+ | #define VALOR_MAGICO 27 | ||
+ | |||
+ | int main (void) | ||
+ | { | ||
+ | int iValor; | ||
+ | |||
+ | while (1) | ||
+ | { | ||
+ | printf (" | ||
+ | scanf (" | ||
+ | if (iValor == VALOR_MAGICO) | ||
+ | { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Diretivas #if, #else e #endif ===== | ||
+ | |||
+ | Sintaxe: | ||
+ | <code c> | ||
+ | #if condição | ||
+ | bloco de condição verdadeiro | ||
+ | #else | ||
+ | bloco condição falso | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | Em certos casos é preciso selecionar um trecho de um código de acordo com uma [[comandos_selecao|condição]] pré-estabelecida, | ||
+ | |||
+ | Esta técnica, chamada compilação condicional, | ||
+ | |||
+ | Pode-se [[comandos_selecao|selecionar]] somente um trecho com o '' | ||
+ | |||
+ | Para finalizar, ressalta-se que o '' | ||
+ | |||
+ | A [[variavel_definicao|variável]] do teste pode ser definida internamente ou ser diretamente definida quando se chama o comando de compilação, | ||
+ | |||
+ | '' | ||
+ | |||
+ | <code c> | ||
+ | /* programa_ifelseendif.c */ | ||
+ | |||
+ | #include < | ||
+ | #define PULA 1 | ||
+ | int main (void) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | | ||
+ | { | ||
+ | #if PULA == 1 | ||
+ | if (i > 10 && | ||
+ | { | ||
+ | | ||
+ | } | ||
+ | #endif | ||
+ | printf (" | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Diretivas #ifdef e #ifndef ===== | ||
+ | |||
+ | Sintaxe: | ||
+ | <code c> | ||
+ | #ifdef variável_pré_definida | ||
+ | bloco de condição verdadeiro | ||
+ | #else | ||
+ | bloco de condição falso | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | ou | ||
+ | |||
+ | <code c> | ||
+ | #ifndef variável_pré_definida | ||
+ | bloco de condição verdadeiro | ||
+ | #else | ||
+ | bloco de condição falso | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | É possível implementar a compilação condicional baseada na // | ||
+ | |||
+ | Pode-se definir a [[variavel_definicao|variável]] no momento da compilação evitando assim a alteração de código quando da geração de versões diferentes. | ||
+ | Usar a seguinte sintaxe para se fazer isto: | ||
+ | |||
+ | '' | ||
+ | |||
+ | <code c> | ||
+ | /* programa_ifdef.c */ | ||
+ | #include < | ||
+ | |||
+ | #ifdef __WINDOWS__ | ||
+ | # | ||
+ | #else | ||
+ | # | ||
+ | #include < | ||
+ | #else | ||
+ | #error " | ||
+ | # | ||
+ | #endif | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | char sFrase[50] = "Alo mundo ", sNome[20]; | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Diretiva #error ===== | ||
+ | Sintaxe: | ||
+ | |||
+ | ''# | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | Esta diretiva deve ser usada quando se quer **exigir** a definição de uma ou outra [[variavel_definicao|variável]] ao nível de compilação ou internamente no programa. | ||
+ | |||
+ | <code c> | ||
+ | /* programa_error.c */ | ||
+ | #include < | ||
+ | |||
+ | #ifdef __WINDOWS__ | ||
+ | # | ||
+ | #else | ||
+ | # | ||
+ | #include < | ||
+ | #else | ||
+ | #error " | ||
+ | # | ||
+ | #endif | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | char sFrase[50] = "Alo mundo ", sNome[20]; | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Erro que ocorre no momento da compilação. | ||
+ | |||
+ | Comando utilizado: '' | ||
+ | |||
+ | Este erro ocorreu devido a falta da diretiva no momento da compilação. | ||
+ | < | ||
+ | programa_error.c: | ||
+ | </ | ||
+ | |||
+ | E estes erros ocorrem devido a ausência do '' | ||
+ | < | ||
+ | programa_error.c: | ||
+ | programa_error.c: | ||
+ | </ | ||
+ | |||
+ | ===== Diretiva #undef ===== | ||
+ | |||
+ | Sintaxe: | ||
+ | |||
+ | ''# | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Na construção de dependências pode-se ter uma situação que seja necessária desabilitar alguma [[variavel_definicao|variável]] de pré-compilação, | ||
+ | |||
+ | Para isto é utilizada a diretiva '' | ||
+ | |||
+ | <code c> | ||
+ | /* programa_undef.c */ | ||
+ | #include < | ||
+ | |||
+ | #ifdef __WINDOWS__ | ||
+ | #undef __LINUX__ /* previne em caso de erro no momento da compilação */ | ||
+ | # | ||
+ | #endif | ||
+ | |||
+ | #ifdef __LINUX__ | ||
+ | # | ||
+ | #endif | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | char sFrase[50] = "Alo mundo ", sNome[20]; | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Variáveis pré-definidas ===== | ||
+ | |||
+ | O pré-compilador disponibiliza uma série de [[variavel_definicao|variáveis]] de pré-compilação para serem utilizadas no programa. Essas variáveis geralmente são utilizadas para código de '' | ||
+ | |||
+ | <code c> | ||
+ | __LINE__ -> Número da linha do no arquivo fonte. | ||
+ | __FILE__ -> Nome do arquivo fonte. | ||
+ | __DATE__ -> Data da compilação. | ||
+ | __TIME__ -> Hora da compilação. | ||
+ | </ | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | int main (void) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | #ifdef DEBUG | ||
+ | /* __FILE__ sempre terá o nome do programa fonte original, mesmo que o executável | ||
+ | | ||
+ | | ||
+ | #endif | ||
+ | |||
+ | for (i=1; i < 10; i++) | ||
+ | { | ||
+ | printf (" | ||
+ | } | ||
+ | |||
+ | #ifdef DEBUG | ||
+ | /* durante o pré-processamento, | ||
+ | | ||
+ | #endif | ||
+ | |||
+ | | ||
+ | |||
+ | #ifdef DEBUG | ||
+ | | ||
+ | #endif | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Resultado da execução depois de compilar com o comando '' | ||
+ | < | ||
+ | Versao de May 7 2009-18: | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | 4 | ||
+ | 5 | ||
+ | 6 | ||
+ | 7 | ||
+ | 8 | ||
+ | 9 | ||
+ | |||
+ | A contagem parou! Estamos na linha 20 | ||
+ | |||
+ | Fim da execução | ||
+ | |||
+ | A última linha do programa é: 26 | ||
+ | </ | ||
+ | |||
+ | --- // |