Environment:
The following macros help to achieve the switch-case on a string.
//////////////////////////////////////////////////////////////
#define STR_SWITCH(str) {
TCHAR* __ps = (TCHAR*)((const TCHAR*)str);
while(1) {
#define STR_SWITCH_END() break; } }
#define STR_CASE(str) if(0 == _tcsicmp(__ps,((const TCHAR*)str)))
#define STR_CASE_EXACT(str) if( 0 == _tcscmp( __ps,
((const TCHAR*)str) ) )
#define DEFAULT_CASE()
//////////////////////////////////////////////////////////////
How do you use these macros? Go through the following piece of code.
Myclass::Function()
{
CString sSwitch("bbbb");
CString sCase("AAAA");
STR_SWITCH(sSwitch) //Start of switch
{ //Opening and closing braces
//NOT MANDATORY for switch.
STR_CASE(sCase)
{ //Opening and closing braces
//MANDATORY for case.
AfxMessageBox("In first case statement");
break; //break has to in braces of case
} //Opening and closing braces
//MANDATORY for case.
break; //Illegal break -- The code works,
//but the output....?????
sCase = _T("bbbb"); //Statements allowed here ;)
STR_CASE_EXACT(sCase)
{
AfxMessageBox("In second case statement");
break;
}
DEFAULT_CASE()
{
//Default handling if any
break;
}
} //Opening and closing braces
//NOT MANDATORY for switch
STR_SWITCH_END() //MANDATORY statement
}
STR_CASE() -> Perform a lowercase comparison of strings.
STR_CASE_EXACT() -> Compares strings, matches the
case of the characters.
DEFAULT_CASE() -> Default case for the switch.
Note the following requirements:
- The “break” statement has to be inside the scope for the STR_CASE, STR_CASE_EXACT, or DEFAULT_CASE.
- Fall through for case statements is not allowed with this switch case.
- Statements between two cases are allowed. Be careful while modifying the string on which the switch is performed.