C Switch/case宏,多种情况

Vir*_*721 3 c switch-statement c-preprocessor

(我知道大多数人会说这太可怕了).

我编写了以下宏来轻松编写使用字符串的开关而不是if/else if/else:

#define str_switch( value )                                    \
do {                                                           \
    const char * __strswitchptr__ = (value);                   \
    if( 0 )                                                    \

#define str_case( test )                                       \
    } if( strcmp( __strswitchptr__, (test) ) == 0 ) {          \

#define str_default                                            \
    } else {                                                   \

#define str_switchend                                          \
} while( 0 );                                                  \
Run Code Online (Sandbox Code Playgroud)

我正在使用这种方式:

char * sVal =  "D";

str_switch( sVal )
{
str_case( "A" )
    printf( "Case A" );
    break;
str_case( "B" )
    printf( "Case B" );
    break;
str_case( "C" )
    printf( "Case C" );
    break;
str_default
    printf( "Error" );
}
str_switchend
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚我是如何修改它所以我可以使用多个案例:

char * sVal =  "D";

str_switch( sVal )
{
str_case( "A" )
    printf( "Case A" );
    break;
str_case( "B" )
    printf( "Case B" );
    break;
str_case( "C" )
str_case( "D" )
str_case( "E" )
    printf( "Case C" );
    break;
str_default
    printf( "Error" );
}
str_switchend
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?谢谢 :-)

Ser*_* L. 7

这个怎么样?当一个案例评估为真时,它将继续通过所有if,直到break遇到a:

#define str_switch( value )                                    \
do {                                                           \
    const char * __strswitchptr__ = (value);                   \
    int __previous_case_true = 0;                              \
    if( 0 )                                                    \

#define str_case( test )                                       \
    } if(  __previous_case_true                                \
        || strcmp( __strswitchptr__, (test) ) == 0 ) {         \
        __previous_case_true = 1;                              \

#define str_default                                            \
    } {                                                        \

#define str_switchend                                          \
} while( 0 );
Run Code Online (Sandbox Code Playgroud)