#include <stdio.h>
#include <map>
#define LOCAL_VAR_DECL( type, var_name ) static std::map<void*, type> var_name
#define LOCAL_VAR_INIT( var_name ) if ( var_name.find( this ) == var_name.end() ) var_name[this]
#define LOCAL_VAR_DEF( type, var_name, init ) LOCAL_VAR_DECL( type, var_name ); LOCAL_VAR_INIT( var_name ) = init
#define LOCAL_VAR( var_name ) var_name[this]
class A
{
public:
void Func( void )
{
LOCAL_VAR_DEF( int, m_State, 0 );
#define m_State LOCAL_VAR( m_State )
switch( m_State )
{
case 0:
{
printf( "m_State = 0\n" );
m_State = 1;
break;
}
case 1:
{
printf( "m_State = 1\n" );
m_State = 0;
break;
}
}
}
void func2( void )
{
/* error: 'm_State' was not declared in this scope
m_State = 0;
*/
}
};
int main() {
A a;
a.Func();
a.Func();
a.Func();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXA+CgojZGVmaW5lIExPQ0FMX1ZBUl9ERUNMKCB0eXBlLCB2YXJfbmFtZSApIHN0YXRpYyBzdGQ6Om1hcDx2b2lkKiwgdHlwZT4gdmFyX25hbWUKI2RlZmluZSBMT0NBTF9WQVJfSU5JVCggdmFyX25hbWUgKSBpZiAoIHZhcl9uYW1lLmZpbmQoIHRoaXMgKSA9PSB2YXJfbmFtZS5lbmQoKSApIHZhcl9uYW1lW3RoaXNdCiNkZWZpbmUgTE9DQUxfVkFSX0RFRiggdHlwZSwgdmFyX25hbWUsIGluaXQgKSBMT0NBTF9WQVJfREVDTCggdHlwZSwgdmFyX25hbWUgKTsgTE9DQUxfVkFSX0lOSVQoIHZhcl9uYW1lICkgPSBpbml0CiNkZWZpbmUgTE9DQUxfVkFSKCB2YXJfbmFtZSApIHZhcl9uYW1lW3RoaXNdCgpjbGFzcyBBCnsKcHVibGljOgoJdm9pZCBGdW5jKCB2b2lkICkKCXsKCQlMT0NBTF9WQVJfREVGKCBpbnQsIG1fU3RhdGUsIDAgKTsKCQkjZGVmaW5lIG1fU3RhdGUgTE9DQUxfVkFSKCBtX1N0YXRlICkKCQkKCQlzd2l0Y2goIG1fU3RhdGUgKQoJCXsKCQkgICAgY2FzZSAwOgoJCSAgICB7CgkJICAgIAlwcmludGYoICJtX1N0YXRlID0gMFxuIiApOwoJCSAgICAJbV9TdGF0ZSA9IDE7CgkJICAgIAlicmVhazsKCQkgICAgfQoJCSAgICBjYXNlIDE6CgkJICAgIHsKCQkgICAgCXByaW50ZiggIm1fU3RhdGUgPSAxXG4iICk7CgkJICAgIAltX1N0YXRlID0gMDsKCQkgICAgCWJyZWFrOwoJCSAgICB9CgkJfQoJfQoJdm9pZCBmdW5jMiggdm9pZCApCgl7CgkJLyogZXJyb3I6ICdtX1N0YXRlJyB3YXMgbm90IGRlY2xhcmVkIGluIHRoaXMgc2NvcGUKCQltX1N0YXRlID0gMDsKCQkqLwoJfQp9OwoKaW50IG1haW4oKSB7CglBIGE7CglhLkZ1bmMoKTsKCWEuRnVuYygpOwoJYS5GdW5jKCk7CglyZXR1cm4gMDsKfQ==