#include <stdio.h>

#ifdef GLOBAL_INSTANCE_DEBUG
#define CREATE_GLOBAL(TYPE, VALUE) MAKE_GLOBAL_INSTANCE_DEBUG(TYPE, VALUE)
#else
#define CREATE_GLOBAL(TYPE, VALUE) MAKE_GLOBAL_INSTANCE(TYPE, VALUE)
#endif
 
#define MAKE_GLOBAL_INSTANCE_DEBUG(TYPE, VALUE)\
    static TYPE *VALUE(int line){\
        static TYPE VALUE##_data;\
        fprintf(stderr ,"use global instanse '%s' in %d.\n", #VALUE, line);\
        return &VALUE##_data;\
    }
// end define
#define MAKE_GLOBAL_INSTANCE(TYPE, VALUE)\
    static TYPE *VALUE(int line){\
        static TYPE VALUE##_data;\
        return &VALUE##_data;\
    }
// end define
 
#define GLOBAL_ACCESS(VALUE) (*VALUE(__LINE__))

CREATE_GLOBAL(int, foo)
#define foo GLOBAL_ACCESS(foo)

int main(void) {
	 int foo = 2;
	 printf("%d", foo);
	return 0;
}