2015-05-28 3 views
1

Есть ли способ заставить препроцессор полностью оценить символы перед токенизацией?Оценка препроцессора силы при Tokenizing

Пример ввода и вывода GFR_SER_##token, GFR_SER_INT.

В качестве примера я пытаюсь выполнить метапрограммирование предварительного процессора с использованием Boost :: PP.

Для вставки строк, это довольно просто, как вы просто добавить уровень косвенности как:

#define str(s) xstr(s) 
#define xstr(s) #s 

Однако, это не работает для tokenizing, поскольку #define xtkz(t) ##t является незаконным из-за символический синтаксис в начале выражения.

Я попытался с помощью BOOST_PP_IDENTIFY(s), который разрешает вход, но, к сожалению, приводит к токенизации из , что Boost, такие как вызов GFR_SER_BOOST_PP_IDENTIFY(s). Есть ли хорошие способы решения этой проблемы?

ответ

2

Вы можете использовать ту же двойную расширить технику, но вы должны помнить, что ## является бинарным оператором:

#define XCONCAT(a,b) a##b 
#define CONCAT(a,b) XCONCAT(a,b) 

#define token INT 
CONCAT(GFR_SER_,token) 

Запуска выше через gcc -E результатов:

# 1 "<stdin>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 30 "/usr/include/stdc-predef.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4 
# 31 "/usr/include/stdc-predef.h" 2 3 4 
# 1 "<command-line>" 2 
# 1 "<stdin>" 




GFR_SER_INT 
Смежные вопросы