2016-09-02 2 views
2

Я пытаюсь использовать инструкцию условной компиляции. Помимо определения функции, которая должна существовать только в сборке отладки, я хочу определить набор переменных/констант/типов, которые существуют только в сборке отладки.Сколько строк покрывается атрибутом условной компиляции Rust?

#[cfg(debug)] 
pub type A = B; 
pub type B = W; 

#[cfg(other_option)] 
pub type A = Z; 
pub type B = I; 
let test = 23i32; 

Сколько строк на самом деле «покрыто» атрибутом условного компиляции в этом случае? Это только одно (чего я ожидаю в этом контексте)? Существуют ли способы гарантировать, что весь блок кода (включая переменные, типы и две функции) покрывается условием?

ответ

2

#[attribute] относится только к следующим item. См. Rust book.

Редактировать: Я не думаю, что в настоящее время возможно распространить атрибут на произвольное количество объявлений.

Дополнительная, подробная информация об атрибутах и ​​их приложениях находится по адресу Rust reference.

+0

Спасибо! Я искал книгу Руста, но просмотрел только объяснения условной компиляции. Спасибо, что направили меня в нужное место! – DerNils

+0

Вторая часть моих вопросов по-прежнему остается: есть ли способ сообщить компилятору, что такой атрибут должен охватывать несколько деклараций? – DerNils

+3

@DerNils Просто быстрый совет о StackOverflow: пожалуйста, задайте только один вопрос на вопрос-пост. В этом случае это нормально, так как вопросы очень тесно связаны. Так что только для вашего SO будущего: обязательно спросите только один вопрос; в противном случае вы рискуете понижать уровень. В этом смысле: добро пожаловать в SO :) –

3

Вы можете использовать модуль для группы вместе все, что должно существовать только для отладки/выпуска, как это:

#[cfg(debug)] 
mod example { 
    pub type A = i32; 
    pub type B = i64; 
} 

#[cfg(not(debug))] 
mod example { 
    pub type A = u32; 
    pub type B = u64; 
} 

fn main() { 
    let x: example::A = example::A::max_value(); 
    println!("{}", x); 
} 

Playground link (обратите внимание, что это всегда будет выводить значение not(debug), поскольку площадка не определяет функция debug, даже в режиме отладки).

Если debug определена, это будет печатать 2147483647 (максимальное значение в i32), в противном случае он будет печатать 4294967295 (максимальное значение u32). Имейте в виду, что оба модуля должны иметь определения для каждого элемента, иначе вы столкнетесь с ошибкой времени компиляции.

Если вы не читали о Attributes, это может быть хорошей идеей сделать это; убедитесь, что вы знаете разницу между внутренними атрибутами (#![attribute]) и внешними атрибутами (#[attribute]).

+0

Я действительно считал, что мои объявления декларируются модулем, но, наконец, решил не принимать его. Для меня модуль - это способ структурирования моего кода, и я не хочу иметь предустановленную структуру, используя условную компиляцию. Однако я должен признать, что я бы решил, если бы пришлось сделать действительно большое количество объявлений (в настоящее время мне нужно сделать только 4) – DerNils

+0

Имея всего 4 объявления, возможно, это возможно в настоящий момент, хотя реальных накладных расходов не существует модуль и, вероятно, сэкономит несколько строк, особенно если вам нужно увеличить его в будущем. Есть ли какая-то конкретная причина, по которой вы против использования модуля, или это слишком громоздко для ваших нужд? – Aurora0001

Смежные вопросы