Обоснование Boost.Preprocessor с использованием макросов вместо простых определений? - PullRequest
2 голосов
/ 31 марта 2011

Например, BOOST_PP_ITERATE и BOOST_PP_ITERATION, как видно из ответа GMan здесь , являются макросами препроцессора без каких-либо параметров.Есть ли причина, по которой они не просто определяются и используются как таковые без ()?

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

Как правило, такая функция, как макрос, может использоваться для предотвращения непреднамеренного макроса расширение.
Например, предположим, что у нас есть следующий вызов макроса:

BOOST_PP_CAT( BOOST_PP_ITERATION, _DEPTH )

и мы ожидаем, что это будет расширено до BOOST_PP_ITERATION_DEPTH.
Однако, если BOOST_PP_ITERATION является подобным объекту (нефункциональным) макросом, он будет расширен до своего собственного определения до токена BOOST_PP_ITERATION_DEPTH генерируется конкатенацией.

1 голос
/ 31 марта 2011

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

...