LINGUAGEM: Linguagem C - Capítulo 3 - 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.