代码之家  ›  专栏  ›  技术社区  ›  ysap

如何连接、评估和串接宏?

  •  1
  • ysap  · 技术社区  · 7 年前

    我试图将宏连接的替换(求值)字符串化。例如:

    #include <stdio.h>
    
    #define FOO_ONE 12
    #define FOO_TWO 34
    #define BAR_ONE 56
    #define BAR_TWO 78
    
    #define MAKE_MAC(mac) // ... what to do here?
    
    void main(int argc, char *argv[])
    {
        printf("FOO: " MAKE_MAC(FOO) "\n");
        printf("BAR: " MAKE_MAC(BAR) "\n");
    }
    

    我想要的结果是:

    FOO: 1234
    BAR: 5678
    

    我尝试了一些形式,我认为最好的尝试是:

    #define STRINGIFY(mac) #mac
    #define CONCAT(mac1, mac2) STRINGIFY(mac1 ## mac2)
    #define MAKE_MAC(mac) CONCAT(mac, _ONE) CONCAT(mac, _TWO)
    

    但是,这只会让我走到这一步:

    FOO: FOO_ONEFOO_TWO
    BAR: BAR_ONEBAR_TWO
    

    那么,在结果连接的宏被串化之前,如何添加对它的额外计算步骤呢?

    2 回复  |  直到 7 年前
        1
  •  3
  •   ysap    7 年前

    试试这个:

    #include <stdio.h>
    
    #define FOO_ONE 12
    #define FOO_TWO 34
    #define BAR_ONE 56
    #define BAR_TWO 78
    
    #define STRINGIFY(arg) #arg
    #define CONCAT(arg1, arg2) STRINGIFY(arg1) STRINGIFY(arg2)
    
    #define MAC(arg) CONCAT(arg##_ONE, arg##_TWO)
    
    int main(){
    
        printf("FOO: " MAC(FOO) "\n");
        printf("BAR: " MAC(BAR) "\n");
    
        return 0;
    }
    

    我的输出:

    FOO: 1234
    BAR: 5678
    
        2
  •  2
  •   Vittorio Romeo    7 年前

    您需要通过引入一个间接层来推迟字符串化:

    #define STRINGIFY_X(x) #x
    #define STRINGIFY(x) STRINGIFY_X(x)
    #define MAKE_MAC(mac) STRINGIFY(mac ## _ONE) STRINGIFY(mac ## _TWO)
    

    live example on wandbox.org