# .clang-format

[**.clang-format**](https://clang.llvm.org/docs/ClangFormatStyleOptions.html) — описывает правила форматирования кода с помощью [**YAML**](https://en.wikipedia.org/wiki/YAML). Поддерживается большинством современных [**IDE**](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8)**. 90%** проблем форматирования решается c помощью **.clang-format**

```yaml
BasedOnStyle: Microsoft
IndentWidth: 4
UseTab: Never
TabWidth: 4
BreakBeforeBraces: Allman
ColumnLimit: 140
AccessModifierOffset: -4
SortIncludes: false
AllowShortBlocksOnASingleLine: false
AlignAfterOpenBracket: DontAlign
AllowShortFunctionsOnASingleLine: Inline
PointerAlignment: Left
AllowShortIfStatementsOnASingleLine: true
SpacesBeforeTrailingComments: 2
AllowShortCaseLabelsOnASingleLine: true
IndentCaseLabels: true
AlwaysBreakTemplateDeclarations: Yes
```

[Попробовать online](https://zed0.co.uk/clang-format-configurator/).

Для оставшихся **10%** проблем необходимо иметь документ по стандартам кодирования.

Хороший пример для этого [**Google C++ Style Guide**](https://google.github.io/styleguide/cppguide.html).

**Unreal Engine** также имеет [статью в документации](https://docs.unrealengine.com/4.26/en-US/ProductionPipelines/DevelopmentSetup/CodingStandard/) на эту тему, но это всего лишь статья, полноценным документом это назвать нельзя. В любом случае там полезная информация, рекомендую с ней ознакомиться.

Автоформатирование также можно настроить при коммите в репозиторий с помощью **pre-commit .git hook**. Об этом рассказывается в видео ниже ([справка по git hooks](https://www.atlassian.com/git/tutorials/git-hooks)).

Рекомендую для форматирования использовать [плагины **VS**](https://app.gitbook.com/@lifeexe-art/s/unreal-automation/neobkhodimoe-po) или создать собственный **bat** файл, в корне проекта:

```bash
format_all_files.bat
```

который будет вызывать **.clang-format** и форматировать все кодовые файлы проекта, с содержимым:

```bash
@echo off

set ProjectRoot=C:\_Projects\_Jenkins\TPS
set SourceCodePath=%ProjectRoot%\Source

FOR /R "%SourceCodePath%" %%f IN (*.cpp, *.h, *.cs) DO (
    clang-format -i "%%f"
    echo %%f
)
PAUSE
```

Перед этим необходимо путь до **.clang-format** [добавить в переменную среды PATH](https://app.gitbook.com/@lifeexe-art/s/unreal-automation/raznoe/kak-ustanovit-peremennuyu-sredy-v-windows), либо использовать полный путь до файла. Исполняемый файл **.clang-format** устанавливается вместе с **VS** и находится в директори&#x438;**:**

`c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin\`

{% embed url="https://www.youtube.com/watch?v=3z_eNJckOig" %}
