LINUX.ORG.RU

Указатели + *


0

0

Возник спор - где лучше ставить звёздочку(для читабельности) - перед объявляемым типом или непосредственно после типа. Т.е. делать int* char или int *char? Как делаете вы?

Религиозный топик! Не все ли равно?

С точки зрения здравого смысла, скорее,

int* ptr;

но это не ложится на Сишный синтаксис:

int i, j, *ptr, k;

так что для однообразия, разумеется,

int *ptr;

иначе потом путаться будешь...

Die-Hard ★★★★★
()
Ответ на: комментарий от JackYF

> Так как звезда - часть типа.

Паскакалист-дельфист детектед!!!

dilmah ★★★★★
()

int *ptr;

Как и завещали пророки K&R

tailgunner ★★★★★
()

Используй православные языки без указателей

anonymous
()

Б.СтраусТруп :) советует

char* p //указатель на символ

char *const p //константный указатель на символ

>Используй православные языки без указателей

+1

quickquest ★★★★★
()
Ответ на: комментарий от Die-Hard

>> int *ptr;

+1

Раз уж пошла такая тема...

if (smthng) do_some_evil1();
else do_some_evil2();

vs.

if (smthng)
    do_some_evil1();
else
    do_some_evil2();

&&

if (smthng)
{
    /* ... */
}

vs.

if (smthng) {
    /* ... */
}

???

Deleted
()
Ответ на: комментарий от tailgunner

> indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs

ну да, где-то так. впрочем, некоторые кто посообразительнее пошли езё дальше и заменили 8 на 4 а tabs на spaces но это уже где-то ближе к гуру, то не всем дано понять.

// wbr

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

-bap
-bbo
-bl
-bli0
-bls
-cbi4
-cli0
-nfc1
-i4
-l78
-npcs
-nprs
-nsaf
-nsai
-nsaw
-nut
-sc
-sob
-ts8

И не ипёт.

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

> Это тоже еретики >:-E

да я в курсе. Джордано Бруно все помнят.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Die-Hard

>но это не ложится на Сишный синтаксис:

>int i, j, *ptr, k;

А это не ложится в c++'сную идеологию. Ибо нефиг определять переменные до их инициализации. А если сразу инициализировать, то можно и на несколько строк разнести, читабельнее будет.

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

>А если сразу инициализировать, то можно и на несколько строк 
> разнести, читабельнее будет.

int*  i = abyrwalg(1),
      j = abyrwalg(2),
      k = abyrwalg(3); 


Сильно помогло? ;)

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

> А если сразу инициализировать, то можно и на несколько строк разнести, читабельнее будет.

http://www.gnu.org/prep/standards/standards.html#Syntactic-Conventions

Don't declare multiple variables in one declaration that spans lines. Start a new declaration on each line, instead. For example, instead of this:

int foo, bar;

write either this:

int foo, bar;

or this:

int foo; int bar;

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

ЗЫ: а в С++ это пример дурного тона - не инициализировать переменные.

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

>какой тип у b, ась?

int, вестимо. Именно поэтому лучше писать звёдочку рядом с именем переменной. Хотя ещё лучше не совмещать объявление нескольких переменных в одной строке.

php-coder ★★★★★
()
Ответ на: комментарий от Deleted

Re^2: Указатели + *

>>> int *ptr;

> +1 

> Раз уж пошла такая тема...

> if (smthng) do_some_evil1();

> else do_some_evil2();

> vs....

if (smthng) {
    do_some_evil1();
} else {
    do_some_evil1();
}

Так не надо будет добавлять скобки, если по каждой ветке захочется добавить ещё пару действий. Ну и не будет проблем при одновременном использовании C и Tcl :) 

gaa ★★
()

> где лучше ставить звёздочку(для читабельности)

Совершенно пофиг. Ибо во-первых любой сишник знает, к чему относится звёздочка, во-вторых компилятор на спутанный тип скорее всего ругаться будет, и ошибка обнаружится при первой же компиляции.

Legioner ★★★★★
()

Не проще ставить между? int * a;

anonymous
()

это не столько вопрос читабельности, сколько вопрос coding style. обсуждается коллективно. главное - чтобы все писали одинаково. у нас было принято int * ptr, именно из-за двойственного прочтения

jtootf ★★★★★
()

Все фффсе ламеры. Никто не додумолсо, что праволславно будет так:

typedef int* intptr;

intptr a, b;

капча: havnoed

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

>Никто не додумолсо, что праволславно...

с учётом аватарки совет особенно прекрасен. по теме : подход с typedef в данном случае - дерьмо, ибо вместо самодокументированного символа * получаем зоопарк унылых нестандартизованных имён, и сопутствующие развлечения во время отладки

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

> по теме : подход с typedef в данном случае - дерьмо, ибо вместо самодокументированного символа * получаем зоопарк унылых нестандартизованных имён, и сопутствующие развлечения во время отладки

Не такое оно уж и редковстречающееся:

$ grep -R intptr /usr/include | wc -l
153

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

> typedef int* intptr;

стандартный intptr_t был введён не потому, что вломы писать звёздочку и предназначен мягко говоря не для этого.

http://www.opengroup.org/onlinepubs/009695399/basedefs/stdint.h.html#tag_13_48

* Integer types capable of holding object pointers

The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to a pointer to void, and the result will compare equal to the original pointer: intptr_t

The following type designates an unsigned integer type with the property that any valid pointer to void can be converted to this type, then converted back to a pointer to void, and the result will compare equal to the original pointer: uintptr_t

[XSI] [Option Start] On XSI-conformant systems, the intptr_t and uintptr_t types are required; [Option End] otherwise, they are optional.

// wbr

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

>Все фффсе ламеры. Никто не додумолсо, что праволславно будет так:

>typedef int* intptr;

Большой-большой +1

Ибо Ъ.

Особенно когда надо юзать char**

typedef char** srt;

str* s;

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

> Сильно помогло? ;)

Ага. =)
int* i = abyrwalg(1);
int* j = abyrwalg(2);
int* k = abyrwalg(3);

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

> стандартный intptr_t был введён не потому, что вломы писать звёздочку и предназначен мягко говоря не для этого.

ни о каком стандартном intptr я не собирался философствовать, я лишь об еще одной возможности записи, поведал. Если будет легче, давайте назовем новый тип IntRef, хотя это не православное название, т.к. это не референс в плюсовом понимании. Однако суффикс Ref на практике не так уж и редко используется.

Очевидно что для int-а, такое сокращение не особо имеет смысл, но для более громоздкого типа может пригодится, т.к. предоставляет еще один из механизмов для реализации инкапсуляции: в *.h файле дефайним тип как void*, а в файле реализации - дефайним "по нормальному".

fmj
()
Ответ на: комментарий от tailgunner

>> в *.h файле дефайним тип как void*, а в файле реализации - дефайним "по нормальному"

>Бгг.

ржы-ржы-ржы.. А потом посмотри, как например устроен интерфейс у Core Foundation в OS X, или у многих "рядом идущих" фреймворков, там ногочисленные CFStringRef-ы и CFArrayRef-ы, правда они для большей type safe-ности дефайнятся как указатели на нигде (в публичном доступе) не обьявленные структуры.

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

> дефайнятся как указатели на нигде (в публичном доступе) не обьявленные структуры.

Ну то есть разумные люди один и тот же typedef по-разному всё же не определяют, ага? О том и спич.

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

> Ну то есть разумные люди один и тот же typedef по-разному всё же не определяют, ага? О том и спич.

void* был применен для демонстрации концепции, про разумность -- нет, не разумные, многократно встречаются typedef-ы, которые в зависимости от дефайнов (аля __APPLE_API_INTERNAL__) дефайнятся либо так, либо так, на разные структуры указывая).

fmj
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.