Listing 8

/*** IN THE FILE GLOBALS.H ***/

#ifdef ALLOCATE_SPACE /* allocate space for globals */
#define GLOBAL
#define INIT(x)  x
#else                 /* just declare externals */
#define GLOBAL   extern
#defint INIT(x)
#endif

/*
NOTE:  The INIT(x) macro won't work with aggregates
because it interprets a comma as indicating a new
macro parameter, not as part of the current
parameter. Aggregates are initialized with
#ifdef ALLOCATE_SPACE
*/

GLOBAL
int  variable1 INIT(=1),
    variable2;

GLOBAL
int  variable1 INIT(=1),
    variable2;

GLOBAL
struct range
    {
    int xmin, xmax, ymin, ymax;
    } data_range
#ifdef ALLOCATE_SPACE
    = { 0, 0, 0, 0, 0 }
#endif
;

/**   IN THE MAIN .C FILE   ***/

#define ALLOCATE_SPACE
#include  "globals.h"

/* So, our inclusion becomes: */

int  variable1 = 1,
    variable2;

struct range
    {
    int xmin, xmax,; ymin, ymax;
    } data_range = { 0, 0, 0, 0 };

/* IN ALL OTHER .C FILES */

#include "globals.h"

/*  So our inclusion becomes: */

extern
int variable1,
   variable2;

extern
struct range
    {
    int xmin, xmax, ymin, ymax;
    } data_range;