Boost.Preprocessor указатель списка с макросом - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь использовать 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 решает проблему в этом случае. Мой реальный код использует гораздо более сложную функцию для расчета индекса таблицы в намного большей таблице.

Есть ли что-то, что я могу сделать или изменить, чтобы исправить это так, что парены и более сложные макросы не вызывают проблем?

1 Ответ

1 голос
/ 25 марта 2019

Второй параметр 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,
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...