> For the complete documentation index, see [llms.txt](https://skkv-itmo.gitbook.io/c-cpp-cookies/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://skkv-itmo.gitbook.io/c-cpp-cookies/ide-features/code-style.md).

# Code style

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

{% embed url="<https://habr.com/en/company/manychat/blog/468953/>" %}
Интересная статья про Code Style
{% endembed %}

## [`editorconfig`](https://editorconfig.org/)

{% embed url="<https://editorconfig.org/>" %}

Аналог clang-format. Применяется по умолчанию в Visual Studio (подробнее [здесь](https://docs.microsoft.com/ru-ru/visualstudio/ide/cpp-editorconfig-properties?view=vs-2019) и [здесь](https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2022)).

## [clang-format](https://clang.llvm.org/docs/ClangFormat.html)

{% embed url="<https://clang.llvm.org/docs/ClangFormatStyleOptions.html>" %}
Опции clang-format
{% endembed %}

`clang-format` - это служебная программа, которая упрощает задание стиля и формата кода на основе набора правил, которые можно настроить в файле `.clang-format` или `_clang-format`.

Можно создать свой файл `.clang-format` или `_clang-format` для настраиваемого определения формата. Такой файл уже присутствует в папке проекта, Visual Studio использует его для форматирования всех файлов исходного кода в этой папке и вложенных в нее папках.

### **`clang-format` в терминале**

В первую очередь необходимо скачать `llvm`: <https://github.com/llvm/llvm-project/releases/tag/llvmorg-21.1.8> либо установить (Unix) при помощи следующих команд:

```bash
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -

# clang-18
sudo add-apt-repository "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-21 main"
sudo apt install clang-21 clang-tools-21 clang-21-doc libclang-common-21-dev libclang-21-dev libclang1-21 clang-format-21 clangd-21 libc++-21-dev libfuzzer-21-dev lldb-21 lld-21 libc++abi-21-dev
```

Используемая на курсе версия clang-format будет указана в логах Actions.

Пример использования:

```bash
clang-format -i "main.c" --style=file
```

Пояснение по примеру:

* `-i` – изменения сразу будут записаны в этот же файл;
* `--style=file` – используется стиль оформления из файла, лежащего там же, где исполняется команда.

Из полезного: `-n` – просмотр изменений без модификации файла.

Простое применение:

1. Клонируем репозиторий курса.
2. Переносим в корень репозитория файлы с исходным кодом.
3. Запускаем по ним из корня репозитория форматирование `clang-format`-ом с `-i`.

### **`clang-format` в Visual Studio**

Visual Studio по умолчанию использует форматирование согласно дефолтным `editconfig` настройкам. Но ей можно указать, что необходимо использовать `clang-format`.

Это можно сделать следующим образом:

1. Положить файл `.clang-format` в директорию проекта.
2. Переходим в `Debug` - `Options` - `Text Editor` - `C/C++` - `Code Style` - `Formatting`.
3. Включаем `Enable ClangFormat support`.
4. Настраиваем `ClangFormat execution` следующим образом:
   1. `for all formating scenarios -.clang-format` применяется и при ручном запуске форматирования кода, и при его написании
   2. `only for manually invoked formatting command -.clang-format` применяется только в случае ручного форматирования кода
5. (Опционально) Если выбран 4.2 или вы не сразу положили `.clang-format` в директорию проекта, то проходимся по каждому файлу кода и нажимаем `Edit` - `Advanced` - `Format Document`.

### **`clang-format` в Visual Studio Code**

{% embed url="<https://marketplace.visualstudio.com/items?itemName=xaver.clang-format>" %}
Основная документация
{% endembed %}

### **`clang-format` в CLion**

CLion имеет встроенный `clang-format`, но CLion можно указать, что нужно использовать другой файл:

1. Положить файл `.clang-format` в директорию проекта.
2. Перейти в `Settings | Editor | Code Style - ClangFormat`.
3. Включить `Enable ClangFormat (only for C/C++/Objective-C)`.

### **`clang-format` в Qt Creator**

Для автоматического форматирования кода необходимо установить плагин [Beautifier](https://doc.qt.io/qtcreator/creator-beautifier.html).

После установки плагина:

1. Положить файл `.clang-format` в директорию проекта.
2. Установить `clang-format`:
   * UNIX/Ubuntu:

     ```bash
     sudo apt install clang-format
     ```
   * Windows: установить LLVM (то есть поставить компилятор Clang с кучей утилит) и найти файл LLVM\bin или скачать напрямую, например [отсюда](https://drive.google.com/file/d/1-Y1TJ_DNE6bdG5IJQWNp13Q45WB8RQ2q/view?usp=sharing).
   * MacOS:

     ```bash
     brew install clang-format
     ```
3. Перейти в `Tools` - `Options` - `Beautifier`.
4. В `General` включить `Enable auto format on file save`.
5. Во вкладке `ClangFormat`
   1. Убедиться, что в Clang Format Command найдет установленный ClangFormat (`clang-format` или `clang-format.exe`)
   2. Рекомендуется выбрать в `Use predefined style` опцию `File` (аналогично Visual Studio)
