Multi-statement Macros in C++

前端 未结 7 1361
轻奢々
轻奢々 2021-01-19 08:00

In C++, is it possible to make a multi-statement macro with nested if statements inside of it like the one below? I\'ve be

相关标签:
7条回答
  • 2021-01-19 08:46

    The way of the C++:

    inline void MATCH_SYMBOL(const Symbol& symbol, const Token& token) {
        /* ... */
        if (something == symbol) {
    
            if ('-' == symbol) {
            /* ... */
            }
            else if ('-' != symbol) {
            /* ... */
            }
        }
        /* ...other steps... */
    }
    
    0 讨论(0)
  • 2021-01-19 08:49

    Note that some of the answers here have a problem.

    For example, for a normal statement you can do this:

    if (foo)
       function();
    else
       otherstuff();
    

    If you followed some of the suggestions here, but if replace function with a macro, it might expand to:

    if (foo)
       if (something) { /* ... */ }
       else           { /* ... */ }; // <-- note evil semicolon!
    else
       otherstuff();
    

    So a common (ugly) hack that people do to avoid this is:

    #define MATCH_SYMBOL(symbol, token)    \
        do                                 \
        {                                  \
           if(something == symbol)         \
           {                               \
              if( symbol == '-')           \
              {                            \
              }                            \
              else if (symbol != '-')      \
              {                            \
              }                            \
              other steps;                 \
           }                               \
        }                                  \
        while (0) // no semicolon here
    

    This is so that the "statement" MATCH_SYMBOL(a, b) can end with a semicolon just like a normal statement. You also have braces around the multiple statements.

    If you think nobody's crazy enough to use this technique, think again. It's very common in the Linux kernel, for example.

    0 讨论(0)
  • 2021-01-19 08:49

    One can also define macro function and implement the function than

    #define MATCH_SYMBOL( symbol, token) match_symbol(symbol,token)
    
    0 讨论(0)
  • If you're using C++ you should avoid using macros altogether. They are not type-safe, they're not namespace-aware, they're hard to debug and just they're plain messy.

    If you need a type-independent function, use templates:

    template <typename T>
    bool match_symbol(T symbol, T token) {
        if(something == symbol){
            if( symbol == '-'){
            }else if (symbol != '-'){
            }
        ...
    

    or if the parameters can be different types:

    template <typename T, typename V>
    bool match_symbol(T symbol, V token) {
        if(something == symbol){
            if( symbol == '-'){
            }else if (symbol != '-'){
            }
        ...
    
    0 讨论(0)
  • 2021-01-19 08:57

    You need to have a backslash (\) at the end of all the lines in the macro but the last one.

    0 讨论(0)
  • 2021-01-19 08:58

    also, see if you can replace the macro with a function.

    ?
    MATCH_SYMBOL(Sym const & symbol, Tok const & token)
    {
        ...
    }
    
    0 讨论(0)
提交回复
热议问题