[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