带宏的Boost.Preprocessor索引列表

时间:2019-03-25 16:08:17

标签: c++ boost-preprocessor

我正在尝试使用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中的括号可以解决问题。我的实际代码使用了一个复杂得多的函数来计算更大表中的表索引。

有什么我可以做或更改的东西,可以解决这个问题,使parens和更复杂的宏不会引起问题吗?

1 个答案:

答案 0 :(得分:1)

BOOST_PP_LIST_AT的第二个参数采用索引/整数。它与引擎盖下的 tricky预处理程序黑客一起使用。参数(expanded)应该是整数,而不是括号内的整数。 MY_INDEX_FUNCTION应该更改,以便传递给BOOST_PP_LIST_AT的参数是 literally 整数-literal:

#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,
))