[CAPÍTULO 1] - [CAPÍTULO 2] - [CAPÍTULO 3]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6]
Pré-processador C
Leitura Recomendada
Introdução
Um programa em C é transformado em código objeto em duas etapas: uma de PRE-PROCESSAMENTO e a outra de COMPILAÇÃO propriamente dita. Na primeira etapa, as DIRETIVAS de PRE-PROCESSAMENTO são convertidas em código C; na segunda etapa, o código C resultante é compilado.Abaixo iremos estudar o PRE-PROCESSADOR de C e suas DIRETIVAS. Ao longo da explicação utilizaremos como exemplo os arquivos de programa
main.c, list.c, list.h, xcpt.c e xcpt.h discutidos ao final da aula Ponteiros.#include
Exemplo
/* main.c **/
#include <stdio.h> /* arquivos de cabeçalho padrão */
#include <stdlib.h>
#include "list.h" /* arquivos de cabeçalho do projeto */
#include "xcpt.h"
int main(int argc, char *argv[])
{
...
}
#define
Exemplo
/* xcpt.h, Rev. 1.1 (c) 2007, Luciano R. Coutinho <lrc@deinf.ufma.br> Implements an exception handling mechanism inspired in Java. **/ #ifndef XCPT_H #define XCPT_H #define XCPT_NAME_MAX_SIZE 32 #define XCPT_CMSG_MAX_SIZE 1024 #define THROW(e,m) __throw((e),(m)) #define TRY(f) __begin_try();f;__end_try(); #define CATCH(e,m) if(m=__catch(e)) #define NULL_POINTER_XCPT "null pointer" #define INDEX_OUT_OF_BOUNDS_XCPT "index out of bounds" #define OVERFLOW_XCPT "overflow" #define UNDERFLOW_XCPT "underflow" #define ILLEGAL_ARGUMENT_XCPT "illegal argument" void __begin_try(void); void __end_try(void); const char * __catch(const char *name); void __throw(const char *name, const char *cmsg); #endif
#if, #else, #elif e #endif
Exemplo-1
Exemplo-2
/** date.h
Author: Luciano R. Coutinho, 2007.
lrc@deinf.ufma.br
*/
#ifndef DATE_H
#define DATE_H
#include <limits.h>
/*
* A type for storing dates in the range:
* from Jan 1st , year 2^22 BCE
* to Dec 31th, year 2^22
*/
#if ( UINT_MAX < 0xffffffff )
typedef long date_t;
#else
typedef int date_t;
#endif
...
#ifdef
Exemplo
Vide inicio dos exemplos anteriores. Eles começam assim:#ifndef FILENAME_H #define FILENAME_H ... #endif
#undef
#line
Macros pré-definidas
Exemplo
Veja um exemplo de uso de__LINE__ e __FILE__ no trecho de programa abaixo que foi apresentado na aula Ponteiros:/*
Add a new element str in the list at a given position pos.
From pos to the end of the list, all existing elements are
shifted right.
Throws:
INDEX_OUT_OF_BOUNDS_XCPT when pos is invalid ( > size +1 )
LIST_FULL_XCPT when the list size equals LIST_MAX_SIZE
LINE_TOO_LONG_XCPT when str is greater than LINE_MAX_SIZE
**/
void list_add(const char * str, unsigned short pos) {
sprintf(xcpt_cmsg,"@%s[%d]\n> list_ins (\"%s\",%d);\n",
__FILE__,__LINE__,str,pos);
if ( pos > size + 1 ) {
THROW(INDEX_OUT_OF_BOUNDS_XCPT,xcpt_cmsg);
return ;
}
...
}
#pragma
Bibliografia e fonte:
- [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
- LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
- [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
- DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
- Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.
Coloque aqui o seu email