c/c++开发分享使用C预处理器进行嵌套宏迭代

使用C预处理器,您可以拥有某种高阶宏。 像这样的东西:

#define ABC(f) f(a) f(b) f(c) #define XY(f) f(x) f(y) #define CODE(x) foo_ ## x ABC(CODE) #undef CODE #define CODE(x) bar_ ## x XY(CODE) #undef CODE 

输出是:

  foo_a foo_b foo_c bar_x bar_y 

是否有一些技巧来嵌套这样的迭代,做这样的事情?

 #define CODE(x) foo_ ## x NEST(ABC, XY, CODE) #undef CODE 

所以输出将是:

 foo_ax foo_ay foo_bx foo_by foo_cx foo_cy 

特别是,我想让ABCXY的定义相互独立,这样我仍然可以单独使用ABC ,或者甚至可以这样做:

 #define CODE(x) foo_ ## x NEST(XY, KLMN, ABC, CODE) #undef CODE 

为了记录,这里解决方案:

 #include  #define ABC (a) (b) (c) #define XY (x) (y) #define CODE(r, prod) BOOST_PP_CAT(foo_, BOOST_PP_SEQ_CAT(prod)) BOOST_PP_SEQ_FOR_EACH_PRODUCT(CODE, (ABC) (XY)) 

产量:

 foo_ax foo_ay foo_bx foo_by foo_cx foo_cy 

    Boost预处理器库提供了几个可以开箱即用的宏。

    BOOST_PP_SEQ_FOR_EACH_PRODUCT将迭代以(x) (y) (z)forms编码的两个或多个列表的笛卡尔积(其被称为序列是库的用语)。

    对于编码为(x, (y, (z, NIL)))列表, BOOST_PP_LIST_FOR_EACH_PRODUCT也会这样做。

    将X宏迭代转换为像这样的“序列”是微不足道的:

     #define LIST_TO_SEQ(X) (X) ABC(LIST_TO_SEQ) 

      以上就是c/c++开发分享使用C预处理器进行嵌套宏迭代相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545935.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注