Файлы

Файлы в С++ должны именоваться в нижнем регистре и могут содержать нижние подчеркивания (_). Это правило также распостраняется и на папки.

  • Файлы исходного кода должны иметь расширение .cc.
  • Публичные заголовочные файлы должны иметь расширение .h.
  • Приватные заголовочные файлы могут иметь расширение .h или .hh на ваш выбор.
  • Прочие файлы, предназначенные для включения, могут иметь расширение .inc.
  • Файлы модулей должны иметь расширение .cppm.

Зачастую, файл исходного кода должен иметь одинаковое имя с ассоциированным заголовочным файлом.

Пример хороших имен файлов:

  • very_cute_cat.h/very_cute_cat.cc
  • utils.hh/utils.cc
  • ring_buffer.h/ring_buffer.inc

Типы

Имена типов (классов, структур, псевдонимов, перечислений) должны быть в PascalCase. Пример:

class MyClass;
struct DataHolder;
enum class BitFlags;
using Alias = MyClass;

Примечание

Исключением может являться тип, который ассоциирован с std/STL/Boost типом. В таком случае имя типа должно быть написано в snake_case-регистре по аналогии с вышеуказанными библиотеками.

Примечание

Это же правило распостраняется на концепты из С++20.

Переменные и константы

Переменные должны быть в snake_case. Это распостраняется на:

  • Локальные переменные
  • Члены классов
  • Аргументы функций

Поля классов и структур должны иметь префикс m_, если они являются приватными полями.

Константы должны быть названы в SCREAMING_SNAKE_CASE, то есть иметь все заглавные буквы со словами, разделенными нижними подчеркиваниями.

Пример:

auto integer_variable = 5;
 
auto fn(int arg1, int arg2, void* pointer_to_data) -> void;
 
class MyClass {
  private:
    int m_num1;
    float m_num2;
    double m_num3;
};
 
constexpr static auto SPEED_OF_LIGHT = 300'000'000;

Функции

Функции следуют тому же правилу, что и локальные переменные - snake_case.

Примечание

Функции, предназначенные для экспорта в QML, должны соблюдать соглашение по именованию Qt - camelCase.

Пример:

class Cat {
  public:
    auto meow() -> void;
    auto meow_loudly() -> int;
};
 
class CatWrapper : public QObject {
  Q_OBJECT
  
  public:
    Q_INVOKABLE void meow();
    Q_INVOKABLE int meowLoudly();
};

Пространства имен

Пространства имен должны быть целиком в нижнем регистре и не содержать нижних подчеркиваний и прочих символов.

Публичные пространства имен должны быть короткими и простыми в написании.

Перечисления

Перечисления и их значения должны целиком следовать конвенции PascalCase. Пример:

enum class BitFlags {
  FlagA = 1 << 0,
  FlagB = 1 << 1,
  FlagC = 1 << 2
};

Макросы

Макросы - это плохо!

Однако, если вы все же решили объявить макрос, то допускается 3 варианта именования:

  • SCREAMING_SNAKE_CASE
  • snake_case
  • $leading_dollar_snake_case

Пример:

#define MY_VERY_COOL_MACRO(...)
 
#define scary_macro_that_scares(...)
 
#define $even_scarier_macro_that_scares_children_and_adults(...)

Названия библиотек

Ваши библиотеки должны называться в соответствии со следующими правилами:

  • Нижний регистр
  • Могут содержать цифры
  • Слова разделены символом -

Примеры хороших названий:

  • cute-cat-lib
  • catlib
  • radar-mms-library3

Далее: Форматирование кода