C++ правила написания указателей
Знаю, что указатель можно указывать как перед переменой, так и после типа данных:
Пример
int* ptr;
int *ptr;
Какой вариант будет лучше использовать?
Ответы (2 шт):
int* описывает тип переменной. ptr задаёт её имя. Объявление int* ptr; логично отделяет тип от имени.
В строке int* ptr, n; C++ разрешает объявить две переменные. ptr получит тип int*, а n против ожиданий получит тип int, не указатель. Так что некоторые учитывают эту особенность компилятора и пишут int *ptr, n; чтобы подчеркнуть способ, которым компилятор присваивает тип имени.
В итоге:
- Следуйте современному стилю:
int* ptr;
- Или подчеркните ваше знание компилятора и следуйте историческому стилю:
int *ptr;
В обоих случаях избегайте объявления нескольких имён в одном операторе.
Это часть стиля форматирования, как и связанный с ним стиль объявления ссылок: int& ref;, против int &ref; или int & ref;. Различные стили более менее равноправны, есть только одно обязательное требование: единство стиля в рамках проекта или группы проектов.
Ну, а как-бы, единство стиля, как и многое другое, достигается тестами. Есть несколько инструментов для этого, один из которых: clang-format. Если заглянуть в его список предустановленных стилей:
LLVM:
PointerAlignment: Right
ReferenceAlignment: Pointer
GNU:
PointerAlignment: Right
ReferenceAlignment: Pointer
Google:
PointerAlignment: Left
ReferenceAlignment: Pointer
Chromium:
PointerAlignment: Left
ReferenceAlignment: Pointer
Microsoft:
PointerAlignment: Right
ReferenceAlignment: Pointer
Mozilla:
PointerAlignment: Left
ReferenceAlignment: Pointer
WebKit:
PointerAlignment: Left
ReferenceAlignment: Pointer
Так что, баш на баш. Лично я, дома, пользуюсь:
PointerAlignment: Right
ReferenceAlignment: Left
Мне кажется понятным, отделяя одну сущность от другой, и, главное, радует глаз:
int *p;
int (*pfn)();
int (T::*pmf)();
int& ref;
Но есть и вариант:
DerivePointerAlignment true
Просто, контроль единообразия в проекте, какое бы оно ни было.