# Директивы и атрибуты компилятора в Rust: Полное руководство

> Как работают директивы и атрибуты компилятора (#![allow], #[derive], #[inline]) в Rust? Гайд с синтаксисом, примерами и советами по чистке кода.

- **URL:** https://eagle2000.space/rust/rust-directives/
- **Date:** 2025-05-26

- **Tags:** rust, dev

---## Введение
Сегодня мы поговорим о **директивах компилятора**, которые в языке Rust называются **атрибутами** (`attributes`). Это специальные аннотации в коде, которые указывают компилятору, как следует обрабатывать определённые участки исходного кода.

Говоря простыми словами: **директива — это инструкция компилятору**: "обрати внимание, здесь есть особое правило".

## Синтаксис директив

Атрибуты оформляются следующим образом:

```rust
#[attribute]
#[attribute(value)]
#[attribute(key = "value")]
#[attribute(value1, value2)]
```

Также существуют глобальные атрибуты, которые применяются ко всему файлу:

```rust
#![attribute]
```

## Пример: игнорирование предупреждений об неиспользуемых переменных

Компилятор Rust по умолчанию "ругается", если вы создаёте переменную, но не используете её:

```rust
let miles: i32 = 1266; // warning: unused variable
```

Чтобы проигнорировать (подавить) это предупреждение, можно использовать директиву `#[allow(unused_variables)]`

### Применение к одной переменной

```rust
#[allow(unused_variables)]
let miles: i32 = 1266;
```

### Применение к нескольким переменным

```rust
#[allow(unused_variables)]
let miles: i32 = 1266;
#[allow(unused_variables)]
let kilometers: i32 = 1300;
```

### Применение ко всей функции

```rust
#[allow(unused_variables)]
fn main() {
    let miles: i32 = 1266;
    let kilometers: i32 = 1300;
}
```

### Применение ко всему файлу

```rust
#![allow(unused_variables)]

fn main() {
    let miles: i32 = 1266;
    let kilometers: i32 = 1300;
}
```

## Где еще применяются директивы?

Rust предоставляет множество директив, каждая из которых решает свою задачу. Вот примеры полезных атрибутов:

- `#[allow(dead_code)]`
Отключает предупреждение о неиспользуемом коде (например, функциях или структурах):

```rust
#[allow(dead_code)]
fn unused_function() {
    println!("Эта функция не используется, но компилятор не ругается.");
}
```

-  `#[cfg(target_os = "linux")]`
Код будет скомпилирован только для Linux:

```rust
#[cfg(target_os = "linux")]
fn platform_specific() {
    println!("Этот код скомпилируется только на Linux");
}
```

- `#[inline(always)]`
Просит компилятор всегда инлайнить функцию:

```rust
#[inline(always)]
fn fast_function(x: i32) -> i32 {
    x * 2
}
```

## Варианты применения директив

Директивы в Rust могут быть применены к:

- переменным
- функциям
- структурам
- модулям
- impl блокам
- трейтам
- константам
- ко всему файлу (через `#![...]`)

## Вывод

Директивы компилятора или атрибуты - это удобная фитча языка Rust которая часто используется в проектах и надо уметь их использовать. Со временем вы встретите их большое множество, но будете уже вооружены.
