---
name: cpp-clang-format
description: Применяет настройки форматирования кода C/C++ через .clang-format. Используйте для приведения стиля кода к единому стандарту проекта (120 символов, отступы 4 пробела, Custom braces, пробелы в скобках).
license: MIT
compatibility: Требуется установленный clang-format (версия 14+). Настройки для C++11/C.
metadata:
  version: "0.3"
  style: Custom (120 cols, 4 spaces, spaces in parentheses)
---

# Навык форматирования C/C++ кода

Этот навык описывает правила применения конфигурации `.clang-format` для проектов на C и C++. Конфигурация является **"Единственным Источником Правды"** для стиля кода.

## ⚙️ Основные правила

| Правило | Описание |
|---------|----------|
| **Файл конфигурации** | `.clang-format` должен находиться в корневой директории проекта |
| **Применение** | Используйте `clang-format -i <файл>` для форматирования файлов на месте |
| **Проверка** | Используйте `clang-format --dry-run <файл>` для проверки стиля без изменений |
| **Интеграция с IDE** | Настройки автоматически подхватываются VS Code, CLion, Visual Studio |
| **Рекурсивное применение** | `find . -name "*.cpp" -o -name "*.h" | xargs clang-format -i` |

## 🔑 Ключевые настройки стиля

Данная конфигурация содержит специфические правила, которые отличаются от стандартных стилей LLVM, Google или Mozilla:

| Параметр | Значение | Описание |
|----------|----------|----------|
| `Language` | `Cpp` | Язык форматирования |
| `Standard` | `Cpp11` | Стандарт языка для парсинга |
| `ColumnLimit` | `120` | Максимальная длина строки (стандарт обычно 80) |
| `IndentWidth` | `4` | Отступы 4 пробела |
| `TabWidth` | `4` | Ширина табуляции |
| `UseTab` | `Never` | **Запрет** на использование символов табуляции |
| `BreakBeforeBraces` | `Custom` | Пользовательская логика расположения скобок |
| `BraceWrapping.AfterClass` | `true` | Скобки классов/структур на новой строке |
| `BraceWrapping.AfterFunction` | `true` | Скобки функций на новой строке |
| `BraceWrapping.AfterStruct` | `true` | Скобки структур на новой строке |
| `BraceWrapping.BeforeElse` | `true` | `else` на новой строке |
| `SpaceAfterCStyleCast` | `true` | Пробел после C-стиля приведения типа `(int) x` |
| `SpacesInParentheses` | `true` | **Пробелы внутри круглых скобок** `( x )` |
| `SpacesInCStyleCastParentheses` | `true` | Пробелы в скобках C-style cast `( int )` |
| `AlignConsecutiveAssignments` | `true` | Выравнивание последовательных присваиваний `=` |
| `AlignConsecutiveMacros` | `true` | Выравнивание последовательных макросов |
| `BinPackArguments` | `true` | Упаковка аргументов при вызове функции |
| `BinPackParameters` | `true` | Упаковка параметров функции |
| `AllowAllParametersOfDeclarationOnNextLine` | `true` | Перенос всех параметров на следующую строку |
| `IncludeBlocks` | `Regroup` | Группировка блоков include |
| `SortUsingDeclarations` | `true` | Сортировка using-деклараций |
| `MaxEmptyLinesToKeep` | `2` | Максимум 2 пустые строки подряд |
| `SpaceBeforeAssignmentOperators` | `true` | Пробел перед операторами присваивания |
| `SpaceBeforeParens` | `ControlStatements` | Пробел перед скобками управляющих конструкций |

## 📋 Примеры форматирования

### До форматирования
```cpp
void process_data(int* buffer,size_t length){
if(length==0)return;
for(size_t i=0;i<length;i++){
buffer[i]=buffer[i]*2;
}
}

#define MAX_VALUE 100
#define MIN_VALUE 0
#define DEFAULT_VALUE 50

int x=10;
int y=20;
int z=30;
```

### После форматирования
```cpp
void process_data( int* buffer, size_t length )
{
    if ( length == 0 ) return;
    for ( size_t i = 0; i < length; i++ )
    {
        buffer[ i ] = buffer[ i ] * 2;
    }
}

#define MAX_VALUE       100
#define MIN_VALUE       0
#define DEFAULT_VALUE   50

int x = 10;
int y = 20;
int z = 30;
```

### Особенности стиля

| Особенность | Пример |
|-------------|--------|
| **Пробелы в скобках** | `func( arg1, arg2 )` |
| **Скобки на новой строке** | `void func()\n{` |
| **Выравнивание присваиваний** | `x = 10;`<br>`y = 20;` |
| **Пробел после cast** | `( int )value` |
| **else на новой строке** | `}\nelse\n{` |
