Это хорошая идея, чтобы печатать указатели? - PullRequest
68 голосов
/ 15 апреля 2009

Я просмотрел некоторый код и заметил, что условием было переключение типов указателей, например

SomeStruct* 

в

typedef SomeStruct* pSomeStruct;

Есть ли в этом какая-то заслуга?

Ответы [ 14 ]

2 голосов
/ 16 января 2019

номер

Это сделает вашу жизнь несчастной, как только вы смешаете ее с const

typedef foo *fooptr;
const fooptr bar1;
const foo *bar2

Являются ли bar1 и bar2 одним и тем же типом?

И да, я просто цитирую Гуру Херба Саттера. Много правды она говорила. ;)

- Правка -

Добавление ссылки на цитируемую статью.

http://www.drdobbs.com/conversationsa-midsummer-nights-madness/184403835

1 голос
/ 15 апреля 2009

Цель typedef - скрыть детали реализации, но определение свойства указателя слишком сильно скрывает и затрудняет чтение и понимание кода. Поэтому, пожалуйста, не делайте этого.


Если вы хотите скрыть детали реализации (что часто бывает полезно), не скрывайте часть указателя. Взять, к примеру, прототип для стандартного интерфейса FILE:

FILE *fopen(const char *filename, const char *mode);
char *fgets(char *s, int size, FILE *stream);

здесь fopen возвращает указатель на некоторую структуру FILE (для которой вы не знаете подробностей реализации). Возможно, FILE не очень хороший пример, потому что в этом случае он мог бы работать с некоторым типом pFILE, который скрывал тот факт, что он является указателем.

pFILE fopen(const char *filename, const char *mode);
char *fgets(char *s, int size, pFILE stream);

Однако это сработает только потому, что вы никогда не возитесь с контентом, на который указывает непосредственно. В тот момент, когда вы набираете указатель на то, что вы в некоторых местах модифицируете код, мне становится очень трудно читать.

1 голос
/ 15 апреля 2009

Win32 API делает это практически со всеми структурами (если не со всеми)

POINT => *LPPOINT
WNDCLASSEX => *LPWNDCLASSEX
RECT => *LPRECT
PRINT_INFO_2 => *LPPRINT_INFO_2

Приятно, что это согласованно, но, на мой взгляд, это не добавляет элегантности.

0 голосов
/ 15 апреля 2009

Некоторое время назад я бы ответил "нет" на этот вопрос. Теперь, с появлением умных указателей, указатели уже не всегда обозначаются звездочкой «*». Так что нет ничего очевидного в том, что тип является указателем или нет.

Так что теперь я бы сказал: нормально указывать указатели, если очень ясно, что это «тип указателя». Это означает, что вы должны использовать префикс / суффикс специально для него. Нет, например, "p" не является достаточным префиксом. Я бы, наверное, пошел с "ptr".

...