C Macro Token Concatenation involving a variable - is it possible?

前端 未结 4 1424
醉梦人生
醉梦人生 2020-12-17 22:00

I\'m trying to define a macro to generate a token name, containing a variable.

Basically, what I\'m trying is this:

#define GLUER(x,y,z) x##y##z
#def         


        
4条回答
  •  無奈伤痛
    2020-12-17 22:38

    What you're trying to do doesn't make sense.

    #define GLUER(x,y,z) x##y##z
    #define PxDIR(x) GLUER(P,x,DIR)
    
    int main() {
      int port;
      port = 2;
      PxDIR(port) |= 0x01;
    }
    

    The preprocesser is run at (before) compile time. Therefore it can't know anything about the contents of the variable port. The preprocessor requires that any values passed as arguments to macros be constants. For example, you could do the following:

    #define GLUER(x,y,z) x##y##z
    #define PxDIR(x) GLUER(P,x,DIR)
    
    int main() {
      PxDIR(2) |= 0x01; //setup port 2
    }
    

    Otherwise, if you want to be able to pass a variable to this macro really the only way is to make sure the code to do so is explicitly generated:

    #define GLUER(x,y,z) x##y##z
    #define PxDIR(x) GLUER(P,x,DIR)
    
    uint16_t* get_port_pointer(uint8_t port_id) {
      if (port == 0) {
        return &PxDIR(0);
      } else if (port == 1) {
        return &PxDIR(1);
      } else if (port == 2) {
        return &PxDIR(2);
      } else if (port == 3) {
        return &PxDIR(3);
      } else {
        return &0;
      }
    }
    
    int main() {
      int port;
      port = 2;
    
      *(get_port_pointer(port)) |= 0x01;
    }
    

    In this way we make sure there is code for any port from 0 to 3 to be accessed. Also, now we have to watch out for null pointers getting returned from the get_port_pointer function.

提交回复
热议问题