Я строю ящик, который имеет функцию foo
. В этом ящике есть макрос bar!
, который делает немного разные вещи в зависимости от того, установлен ли foo
.
Я мог бы продублировать весь макрос:
#[cfg(feature = "foo")]
macro_rules! bar {
// Lots of rules...
( A ) => {
B
}
}
#[cfg(not(feature = "foo"))]
macro_rules! bar {
// Lots of rules...
( A ) => {
C
}
}
Это много подверженных ошибкам дубликатов. Два подхода, которые не работают:
Мы не можем переместить cfg
внутри макроса, потому что тогда он развернется в области видимости пользователя ящика, у которого нет соответствующей функции foo
.
Мы не можем использовать вспомогательный макрос #[doc(hidden)] #[macro_export] macro_rules! bar_priv_impl__
и использовать #[cfg]
в вспомогательном макросе начиная с Rust 1.30, поскольку теперь пользователи могут запрашивать use mycrate::bar;
только для импорта макроса bar!
, что приводит к ошибкам как bar_priv_impl__!
не определено.
Есть ли способ лучше, чем полное дублирование макросов? Будет очень плохо, если у вас есть N функций, которые вы тестируете, так как вам нужно 2 n дубликатов.