Это невозможно с compile_error!
.Макрос оценивается задолго до того, как происходит оптимизация кода.В основном только два контекста, в которых compile_error!
сейчас полезен:
- Условная компиляция с
#[cfg(...)]
- Макросом, генерирующим код, который может содержать
compile_error!
Оба из них оцениваются до появления ошибки compile_error!
.
Нет приятных функций, позволяющих вам делать то, что вы хотите достичь.Тем не менее, существует своего рода взломать .Он используется no-panic
crate и вызывает ошибку во время соединения (то, что вы обычно видите довольно редко в Rust).
Трюк работает, вставляя ссылку на неизвестный символ в каждом месте паники.Если оптимизатор (который выполняется очень поздно в конвейере компиляции, но все еще в основном перед связыванием) может удалить ветвь, ведущую к panic
, он также удаляет ссылку на неизвестный символ.Если оптимизатор не может удалить ветвь, то окончательный код содержит ссылку на этот неизвестный символ, и компоновщик выдаст ошибку «неопределенная ссылка на ...».Это нехорошая ошибка, но она останавливает компиляцию программы.
Ваша цель немного более сложна: вам нужна ошибка, только если компилятор уверен, что паника обязательно произойдет.Это более сложно, но вы также можете использовать этот хак для его решения.