Как включить версию из Cargo.toml в мою программу? [Дубликат]

6.7.8 / 4 [C99]

Все выражения в инициализаторе для объекта с длительностью статического хранения должны быть постоянными выражениями или строковыми литералами.

В static int i = initializer(); RHS не является постоянным выражением, поэтому код не компилируется в C.

В C ++ такого ограничения нет и код корректно сформирован в C ++.

81
задан Jimmy Cuadra 8 January 2015 в 13:41
поделиться

2 ответа

Cargo передает некоторые метаданные компилятору через переменные среды, список которых можно найти на страницах документации Cargo .

В среде компилятора этот метод в коде Cargo. Этот код стал более сложным с более ранних версий, и весь список переменных уже не является очевидным из-за его динамичности. Тем не менее, по крайней мере, здесь устанавливаются следующие переменные (из списка в документах):

CARGO
CARGO_MANIFEST_DIR
CARGO_PKG_VERSION_MAJOR
CARGO_PKG_VERSION_MINOR
CARGO_PKG_VERSION_PATCH
CARGO_PKG_VERSION_PRE
CARGO_PKG_VERSION
CARGO_PKG_NAME
CARGO_PKG_DESCRIPTION
CARGO_PKG_HOMEPAGE
CARGO_PKG_AUTHORS
OUT_DIR

Вы можете получить доступ к переменным среды, используя макрос env!() . Чтобы вставить номер версии вашей программы, вы можете сделать это:

const VERSION: &'static str = env!("CARGO_PKG_VERSION");

// ...

println!("MyProgram v{}", VERSION);

Если вы хотите, чтобы ваша программа была скомпилирована даже без Cargo, вы можете использовать option_env!() :

const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");

// ...

println!("MyProgram v{}", VERSION.unwrap_or("unknown"));
118
ответ дан Shepmaster 22 August 2018 в 20:47
поделиться

built -crate помогает с сериализацией множества условий Cargo без всех шаблонов.

6
ответ дан user2722968 22 August 2018 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: