【问题标题】:How to reduce number arguments in xmacro table expansion如何减少 xmacro 表扩展中的参数数量
【发布时间】:2016-03-26 18:12:20
【问题描述】:

我一直在使用这样的基于 xmacros 的表:

#define TABLE_MACRO(MAN_TYPE, WOMAN_TYPE) \
   MAN_TYPE(   John, Doe, "Addr1", arg_a, arg_b, arg_c)   \
   WOMAN_TYPE( Jane, Joe, "Addr2", arg_a, arg_b, arg_c)   \
   MAN_TYPE(   Bill, Tom, "Addr3", arg_a, arg_b, arg_c)   \

我的表格比我展示的参数多得多,但是,在许多情况下,我只将表格扩展为 1 或 2。我使用它们来生成变量和枚举。例如:

#define NAME_LIST(name,last,addr, arg1, arg2, arg3) name,\

enum {
   TABLE_MACRO(NAME_LIST,NAME_LIST)
}Name_List;

有没有办法获取 TABLE_MACRO 并重新定义或更改它的扩展顺序以使其扩展为这个?

TABLE_MACRO_NAMES_ONLY(MAN_TYPE, WOMAN_TYPE) \
   MAN_TYPE(   John, )                       \
   WOMAN_TYPE( Jane, )                       \
   MAN_TYPE(   Bill, )                       \

我的目标是简化表格,使用如下:

#define NEW_NAME(name)  New_##name,

TABLE_MACRO_NAMES_ONLY(NEW_NAME, NEW_NAME)

【问题讨论】:

    标签: c-preprocessor x-macros


    【解决方案1】:

    希望等待得到回报:
    我想出了两个解决方案。一种可以保持原来的表格不变,但使用起来有点不方便的地方。

    解决方案 1

    // your original table as is
    #define TABLE_MACRO(MAN_TYPE, WOMAN_TYPE) \
       MAN_TYPE(   John, Doe, "Addr1", arg_a, arg_b, arg_c)   \
       WOMAN_TYPE( Jane, Joe, "Addr2", arg_a, arg_b, arg_c)   \
       MAN_TYPE(   Bill, Tom, "Addr3", arg_a, arg_b, arg_c)   \
    
    // create Names only table
    #define MTYPE(a,b,c,d,e,f) MAN(a)
    #define WTYPE(a,b,c,d,e,f) WOMAN(a)
    #define TABLE_NAMES_ONLY \
       TABLE_MACRO(MTYPE,WTYPE)
    
    // usage (here, the defines MUST be named "MAN" and "WOMAN".
    // At least they have to align with the definition of MTYPE and WTYPE)
    #define MAN(name) man_##name
    #define WOMAN(name) woman_##name
    TABLE_NAMES_ONLY
    

    另一种解决方案是通过两个参数扩展您的原始表,但最终使用起来更容易。

    解决方案 2

    // your extended original table (see extra arguments)
    #define TABLE_MACRO(MAN_TYPE, WOMAN_TYPE, m_extra, w_extra) \
       MAN_TYPE(   John, Doe, "Addr1", arg_a, arg_b, arg_c, m_extra, w_extra)   \
       WOMAN_TYPE( Jane, Joe, "Addr2", arg_a, arg_b, arg_c, m_extra, w_extra)   \
       MAN_TYPE(   Bill, Tom, "Addr3", arg_a, arg_b, arg_c, m_extra, w_extra)   \
    
    // create Names only table
    #define MTYPE(a,b,c,d,e,f, m_extra, w_extra) m_extra(a)
    #define WTYPE(a,b,c,d,e,f, m_extra, w_extra) w_extra(a)
    #define TABLE_NAMES_ONLY(male_func, female_func) \
       TABLE_MACRO(MTYPE, WTYPE, male_func, female_func)
    
    // usage (here, the naming of the 2 following defines is arbitrary)
    #define MAN(a) man_##a
    #define WOMAN(a) woman_##a
    TABLE_NAMES_ONLY(MAN, WOMAN)
    
    // different usage:
    #define NAME(a) name_##a
    TABLE_NAMES_ONLY(NAME, NAME)
    

    这两种解决方案都已使用gcc -E yourTestFile.c 在 gcc 5.3.0 中进行了测试。 可能还有更好的解决方案,但这些是我想到的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-16
      • 2019-07-28
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2015-03-16
      • 2012-01-30
      • 2014-08-15
      相关资源
      最近更新 更多