Есть несколько способов сделать что-то в моем ящике, некоторые из которых приводят к быстрому выполнению, некоторые с низким двоичным размером, некоторые имеют другие преимущества, поэтому я предоставляю пользовательские интерфейсы для всех из них. Неиспользуемые функции будут оптимизированы компилятором. Внутренние функции в моей корзине также должны использовать эти интерфейсы, и я хотел бы, чтобы они уважали выбор пользователя во время компиляции.
Существуют атрибуты условной компиляции, такие как target_os
, которые хранят значение, подобное * 1004. * или windows
. Как я могу создать такой атрибут, например prefer_method
, чтобы я и пользователь могли использовать его, как в следующих фрагментах кода?
Мой ящик:
#[cfg(not(any(
not(prefer_method),
prefer_method = "fast",
prefer_method = "small"
)))]
compile_error("invalid `prefer_method` value");
pub fn bla() {
#[cfg(prefer_method = "fast")]
foo_fast();
#[cfg(prefer_method = "small")]
foo_small();
#[cfg(not(prefer_method))]
foo_default();
}
pub fn foo_fast() {
// Fast execution.
}
pub fn foo_small() {
// Small binary file.
}
pub fn foo_default() {
// Medium size, medium fast.
}
Пользователь crate:
#[prefer_method = "small"]
extern crate my_crate;
fn f() {
// Uses the `foo_small` function, the other `foo_*` functions will not end up in the binary.
my_crate::bla();
// But the user can also call any function, which of course will also end up in the binary.
my_crate::foo_default();
}
Я знаю, что есть атрибуты --cfg
, но AFAIK они представляют только логические флаги, а не значения перечисления, которые позволяют устанавливать несколько флагов, когда допустимо только одно значение перечисления.