Использование запятых внутри макроса BOOST_CHECK_EXCEPTION - PullRequest
0 голосов
/ 28 августа 2018

Я работаю над проектом, который использовал BOOST_CHECK_EXCEPTION в модульных тестах. Первый аргумент - это блок кода. Хорошо работает, когда в тестируемом коде нет запятых. Как только код получает запятую, которая не находится в скобках (например, вызов конструктора с фигурными скобками и несколькими аргументами), BOOST_CHECK_EXCEPTION перестает работать. Препроцессор обрабатывает запятую как разделитель аргументов. Препроцессор знает о скобках, но не о скобках.

Таким образом, блоки кода, содержащие запятые без скобок, определяются как лямбда-выражения вне BOOST_CHECK_EXCEPTION. Это работает, но я ищу решение, которое делает вызовы BOOST_CHECK_EXCEPTION более равномерными. В конце концов, запятые могут появляться и исчезать из выражений при разработке кода.

Прежде всего, просто задержка расширения запятой после расширения BOOST_CHECK_EXCEPTION не работает. Реализация BOOST_CHECK_EXCEPTION (BOOST_CHECK_THROW_IMPL) будет по-прежнему отклонять дополнительные аргументы. Это означает, что BOOST_PP_COMMA не поможет.

Один из подходов, которые я рассмотрел, - это наличие макроса CODE_WRAPPER, который бы взял блок кода и обернул его в код, содержащий скобки. Эти скобки должны пережить все расширения препроцессора. for и while используют скобки о коде, но я не смог поместить блоки кода внутри них. Аналогично, я не смог получить блок кода внутри вызова функции. Все они ожидают выражения.

Один из подходов, который работает, это выражение оператора. Это расширение GNU, поэтому оно ограничивает код gcc и clang, что нежелательно.

В документации Boost рекомендуется do {...} while(0), но это не устраняет проблему с запятыми. https://www.boost.org/doc/libs/1_68_0/libs/test/doc/html/boost_test/utf_reference/testing_tool_ref/assertion_boost_level_exception.html

Теперь я думаю об обертывании BOOST_CHECK_EXCEPTION внутри макроса, который бы прозрачно определял лямбду для вызывающей стороны. И я удивлен, что я не вижу большой помощи онлайн. Я чувствую, что упускаю что-то очевидное.

Есть ли какой-либо простой способ использовать BOOST_CHECK_EXCEPTION с блоками кода, которые содержат запятые без скобок?

...