Boost.Preprocessor 带宏的索引列表

Boost.Preprocessor index list with macro

我正在尝试使用 Boost.Preprocessor 做一些编译时工作。我想使用在其他宏中计算的值来索引 table。当我尝试时出现以下错误:"concatenation with '(' in macro 'BOOST_PP_BOOL_I' does not create a valid token."

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

#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 中的括号可以解决本例中的问题。我的实际代码使用更复杂的函数来计算更大 table.

中的 table 索引

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

BOOST_PP_LIST_AT的第二个参数取一个index/integer。它与引擎盖下的 棘手的预处理器 hacks 一起工作。 parameter(expanded) 应该恰好是整数文字,而不是括号内的整数。应更改 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,
))