Real-world use of X-Macros

前端 未结 7 1214
花落未央
花落未央 2020-11-22 12:21

I just learned of X-Macros. What real-world uses of X-Macros have you seen? When are they the right tool for the job?

7条回答
  •  耶瑟儿~
    2020-11-22 12:35

    https://github.com/whunmr/DataEx

    I am using the following xmacros to generate a C++ class, with serialize and deserialize functionality built in.

    #define __FIELDS_OF_DataWithNested(_)  \
      _(1, a, int  )                       \
      _(2, x, DataX)                       \
      _(3, b, int  )                       \
      _(4, c, char )                       \
      _(5, d, __array(char, 3))            \
      _(6, e, string)                      \
      _(7, f, bool)
    
    DEF_DATA(DataWithNested);
    

    Usage:

    TEST_F(t, DataWithNested_should_able_to_encode_struct_with_nested_struct) {
        DataWithNested xn;
        xn.a = 0xCAFEBABE;
        xn.x.a = 0x12345678;
        xn.x.b = 0x11223344;
        xn.b = 0xDEADBEEF;
        xn.c = 0x45;
        memcpy(&xn.d, "XYZ", strlen("XYZ"));
    
        char buf_with_zero[] = {0x11, 0x22, 0x00, 0x00, 0x33};
        xn.e = string(buf_with_zero, sizeof(buf_with_zero));
        xn.f = true;
    
        __encode(DataWithNested, xn, buf_);
    
        char expected[] = { 0x01, 0x04, 0x00, 0xBE, 0xBA, 0xFE, 0xCA,
                            0x02, 0x0E, 0x00 /*T and L of nested X*/,
                            0x01, 0x04, 0x00, 0x78, 0x56, 0x34, 0x12,
                            0x02, 0x04, 0x00, 0x44, 0x33, 0x22, 0x11,
                            0x03, 0x04, 0x00, 0xEF, 0xBE, 0xAD, 0xDE,
                            0x04, 0x01, 0x00, 0x45,
                            0x05, 0x03, 0x00, 'X', 'Y', 'Z',
                            0x06, 0x05, 0x00, 0x11, 0x22, 0x00, 0x00, 0x33,
                            0x07, 0x01, 0x00, 0x01};
    
        EXPECT_TRUE(ArraysMatch(expected, buf_));
    }
    

    Also, another example is in https://github.com/whunmr/msgrpc.

提交回复
热议问题