【问题标题】:Boost.Preprocessor index list with macroBoost.Preprocessor 索引列表与宏
【发布时间】:2019-03-25 16:08:17
【问题描述】:

我正在尝试使用 Boost.Preprocessor 来做一些编译时工作。我想使用在其他宏中计算的值来索引表。当我尝试时,出现以下错误:“在宏 'BOOST_PP_BOOL_I' 中与 '(' 连接不会创建有效的令牌。”

这是产生问题的最简单的代码。

#define MY_TABLE (0, (1, BOOST_PP_NIL))
#define MY_INDEX_FUNCTION(x) (x)
void func() {
    int y = BOOST_PP_LIST_AT(MY_TABLE, MY_INDEX_FUNCTION(0));
}

很容易确定删除MY_INDEX_FUNCTION 中的括号可以解决这种情况下的问题。我的实际代码使用更复杂的函数来计算更大表中的表索引。

有什么我可以做或改变的事情可以解决这个问题,使括号和更复杂的宏不会引起问题吗?

【问题讨论】:

    标签: c++ boost-preprocessor


    【解决方案1】:

    BOOST_PP_LIST_AT 的第二个参数采用索引/整数。它在引擎盖下与棘手的预处理器黑客一起工作。参数(扩展)应该是一个整数文字,而不是括号内的整数。应该更改MY_INDEX_FUNCTION,以便传递给BOOST_PP_LIST_AT 的参数字面意思是整数字面量:

    #define MY_INDEX_FUNCTION(x)  x
    

    宏不适用于算术表达式,这将不起作用:

    #define MY_INDEX_FUNCTION(x) (x+1)
    NOR
    #define MY_INDEX_FUNCTION(x)  x+1
    

    但你可以这样做

    #define MY_INDEX_FUNCTION(x) MY_INDEX_FUNCTION_ ## x
    #define MY_INDEX_FUNCTION_0 1
    #define MY_INDEX_FUNCTION_1 2
    #define MY_INDEX_FUNCTION_2 3
    //...
    

    这个宏定义可以由(python-)脚本创建

    def my_index_function(x):
        # insert the behavior of the macro here
        return x+1
    
    MACRO_NAME = "MY_INDEX_FUNCTION"
    INDEX_MAX = 255
    
    for x in range(INDEX_MAX):
        print("#define %s_%i %i" % (
            MACRO_NAME,
            x,
            my_index_function(x),
        ))
    
    print("#define %s(x) %s_ ## x" % (
        MACRO_NAME,
        MACRO_NAME,
    ))
    

    【讨论】:

    • 我发现有丑陋的预处理器技巧,正如你提到的。我希望有其他方法可以完成我想做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2020-05-06
    • 2019-03-17
    • 1970-01-01
    • 2011-11-07
    • 2010-09-15
    相关资源
    最近更新 更多