BEGIN/ENDブロック

昔、AWKにあるBEGIN/ENDブロックが、C++でも使えたら便利かもしれないと思って、
マクロで作ったことを思い出す。
脳内から発掘したものをここに晒しておく。

#define CAT(X,Y) CAT2(X,Y)
#define CAT2(X,Y) X##Y

#define BEGIN						\
static class CAT(Begin_class,__LINE__)			\
{							\
  public:						\
    CAT(Begin_class,__LINE__)();			\
} CAT(Begin_class_object,__LINE__);			\
CAT(Begin_class,__LINE__)::CAT(Begin_class,__LINE__)()
#define END						\
static class CAT(End_class,__LINE__)			\
{							\
  public:						\
    ~CAT(End_class,__LINE__)();				\
} CAT(End_class_object,__LINE__);			\
CAT(End_class,__LINE__)::~CAT(End_class,__LINE__)()

こう使う。

BEGIN { std::cout << "BEGIN" << std::endl; }
END { std::cout << "END" << std::endl; }

int main()
{
  std::cout << "main" << std::endl;
}

長い間、思い出さなかったということは、実用性がほとんどないのだろう。