Обоснование для Boost.Препроцессор, использующий макросы вместо простых определений?
-
14-11-2019 - |
Вопрос
Например BOOST_PP_ITERATE
и BOOST_PP_ITERATION
, как видно из ответа GMan здесь, являются макросами препроцессора, без каких-либо параметров.Есть ли причина, по которой они не являются просто простыми определениями и используются как таковые без ()
?
Решение
Как правило, функция, подобная macro, может использоваться для предотвращения непреднамеренного
расширения макроса.
Например, предположим, что у нас есть следующий вызов макроса:
BOOST_PP_CAT( BOOST_PP_ITERATION, _DEPTH )
и мы ожидаем, что это будет расширено до BOOST_PP_ITERATION_DEPTH
.
Однако, если BOOST_PP_ITERATION
является объектоподобным (нефункциональным) макросом,
он будет расширен до своего собственного определения перед токеном
BOOST_PP_ITERATION_DEPTH
генерируется путем объединения.
Другие советы
Предположительно, потому, что они выполняют операции:следовательно, их использование должно давать понять, что вы на самом деле призывающий что-то, а не просто использование какой-то константы.