LINUX.ORG.RU

pTYPE vs TYPE * в си

 


1

1

Какие есть плюсы и минусы такого метода?

typedef  Bytes * pBytes;

Error RBytesRemove (pBytes bytes, UInt32 pos, UInt32 len);
Error RBytesReplace(pBytes bytes, pBytes what, pBytes by);
Error RBytesRemove (Bytes * bytes, UInt32 pos, UInt32 len);
Error RBytesReplace(Bytes * bytes, Bytes * what, Bytes * by);

ЗЫ: По значению Bytes использоваться не будет, то есть сигнатуры XXX(Bytes bytes) не будет, ибо нефиг через стек гонять структуры.

Внесите царя.

По длине одинкаково, в сообщениях компилера будет ~одинаково. Фигня короч.

anonymous
()
Ответ на: комментарий от someoneelsenotme

что ВСЕ typedef - абсолютное зло

не все. atomic_t - отличный пример тайпдефа. т.е обобщив - все opaque pointers просятся под тайпдеф.

vvviperrr ★★★★★
()
Ответ на: комментарий от Harald

Плох ли ВыньАПИ-вэй? Мне, например, штырил факт что каждый тип (пусть и тайпдефченый от, скажем, инт) шел в смвою функцию. И объявив

HWND i;
Можно было сразу сказать что это за хреновина и в какую функцию она полетит. В иксах те же слоны.

someoneelsenotme
() автор топика

минусы

  • const pBytes != const Bytes *
    const pByptes == Bytes *const
    
  • Бывает приходится смотреть, а не указатель ли это часом, чтобы его можно было инициализировать как NULL или проверить на это дело. Тогда может захотеться определить NULL_BYTES макрос, от которого мало толку.

Вообще смысла скрывать от пользователя, что это указатель, нет. Особенно если это opaque тип, всё равно он недоопределён.

xaizek ★★★★★
()

«typedef Bytes * pBytes;» плохо, даже чертовски плохо, пытается рассказать о некоей внутренней механике типа, а не его назначении..да ещё добавляет чёртов префикс, возможно нарушая соглашения об именах (уже получилось что один тип именуется с заглавной, какой-то со строчной)

«typedef Byte * ByteString» уже будет гораздо лучше.

MKuznetsov ★★★★★
()

Так до LPCWSTR недолго докатиться.

А вообще, смысла в данном случае в таком typedef нет никакого, так как он не привносит никаких преимуществ с точки зрения семантики. Весь смысл этого префикса “p” — показать, что мы имеем дело с указателем, но ведь для этого лучше подходит сам символ указателя.

А если нам придётся иметь дело с Bytes **? Как будем этот тип именовать? Bytes **, pBytes *, typedef Bytes ** ppBytes?

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Так до LPCWSTR недолго докатиться.

HWND LRESULT CALLBACK!

APIENTRY DLGPROC!

LRESULT HRESULT!

простите, не удержался :)

Harald ★★★★★
()

Ты просто заменил один символ (звёздочку) на другой (p). В чём профит-то? Я ещё могу понять, когда это некий opaque pointer, с которым напрямую работать всё равно невозможно, но ты же наверняка хочешь делать что-то типа

Bytes blob = { /*whatever*/ };
RBytesRemove(&blob, 42, 42);
Ну и зачем весь этот сыр-бор? KISS же

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.