Обоснование для Boost.Препроцессор, использующий макросы вместо простых определений?

StackOverflow https://stackoverflow.com/questions/5499392

Вопрос

Например 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 генерируется путем объединения.

Другие советы

Предположительно, потому, что они выполняют операции:следовательно, их использование должно давать понять, что вы на самом деле призывающий что-то, а не просто использование какой-то константы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top