terça-feira, 18 de dezembro de 2012

ANSI extern



               Ao tentar manter um mínimo de portabilidade do código para os diferentes compiladores que podem ser usados, um caso interessante surge, quando se pretende usar o recurso de uma variável em mais de um arquivo utilizando extern, com isto o item terá sua ligação com os diversos módulos que fazem referencia. Os compiladores modernos conseguem ignorar este cuidado e fazem o recurso funcionar sem que você tenha essa preocupação em declarar uma variável externa. Como esta característica não é padronizada, não há garantias de seu correto uso, o padrão ANSI deve ser usado para manter compatível com os diversos casos.

               Uma forma de garantir o comportamento da variável é garantir que seja declarada em um modulo e indicada como extern nos demais. Podemos conseguir este efeito com o auxilio do pré-processador de macros usando um arquivo cabeçalho. No modo tradicional temos:

MAIN.C                    DUMMY1.C                       DUMMY2.C
char letra;

extern char letra;

extern char letra;




Os macros usados a seguir têm como objetivo facilitar a declaração e o uso de variáveis globais nos vários módulos do programa.

MAIN.H
#ifdef __MAIN_C__
      #define EXTERN
#else
      #define EXTERN      extern
#endif

EXTERN char g_cLetra;









Usando a macro EXTERN, no primeiro momento pode parecer confuso o uso do macro, mas a ideia consiste em usar o pré-processador de macros para fazer o trabalho de declaração. Inicialmente temos a seguinte apresentação:

MAIN.C                             DUMMY1.C                           DUMMY2.C
#include "main.h"

#define __MAIN_C__

#include "main.h"

#include "main.h"








Quando o pré-processador executar a macro, o arquivo que estiver definido como __MAIN_C__ ira incluir a variável 'EXTERN char g_cLetra', como 'char g_cLetra', os demais arquivos incluem a variável como 'extern char letra', o resultado ficou igual ao do modo tradicional.

 A principio pode parecer mais trabalhoso e seria caso o numero de variáveis globais compartilhada em vários módulos fossem apenas uma ou duas, quando o numero  de variáveis globais e módulos passa a crescer, a vantagem fica obvia com um só local para declaração tornando mais fácil compreender, organizar e manter o código.

Nenhum comentário:

Postar um comentário