; gaccess.h-------------------------------------------------------
#ifndef INCLUDED_GACCESS_H
#define INCLUDED_GACCESS_H
#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__))
#endif
; end gaccess.h-------------------------------------------------------
こんな感じで使用します。
; main.c----------------------------------------------------------------
#include <stdio.h>
#define GLOBAL_INSTANCE_DEBUG
#include "gaccess.h"
CREATE_GLOBAL(int, x)
#define x GLOBAL_ACCESS(x)
CREATE_GLOBAL(int *, p)
#define p GLOBAL_ACCESS(p)
int main(){
x = 5;
p = &x;
printf("%p %d", p, *p);
return 0;
}関数なので、不意に意図しないところで値が書き換えられたとしても、最後に呼ばれた行を出力することができるのでデバッグがしやすいはずです。
グローバル変数は使いたくなかったのですが、使わないとコードがとんでもなくなりそうな気がしたので、このようなマクロを定義してみたのですが、実用性はあると思いますか?
このマクロだと普通の変数と違ってこんなことができない、だとか、何か弊害があれば教えてください。
codeタグを追加しました。詳しくはフォーラムルールをご覧ください。 by softya(ソフト屋)