Есть ли разница между этими двумя декларациями? - PullRequest
3 голосов
/ 06 февраля 2012

У меня следующая структура

typedef struct _LSHFunctionT 
{
    double *a;
    double b;
} LSHFunctionT, *PLSHFunctionT;

Мой вопрос; есть ли разница между этими двумя декларациями

PLSHFunctionT myPointer1;

и

LSHFunctionT *myPointer2;

, а если нет, то почему люди явно используют два из них (LSHFunctionT и * PLSHFunctionT). Почему бы просто не использовать LSHFunctionT.

Идет ли так же для следующих двух объявлений

PLSHFunctionT *myPointer3;

и

LSHFunctionT **myPointer3;

Ответы [ 7 ]

2 голосов
/ 06 февраля 2012

Да, они идентичны.

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

void foo(PLSHFunctionT & ref);

void foo(LSHFunctionT * (&ref));

Я даже не уверен, что синтаксис для второго верен!

2 голосов
/ 06 февраля 2012
typedef struct _LSHFunctionT 
{
    double *a;
    double b;
} LSHFunctionT, *PLSHFunctionT;

Да, PLSHFunctionT x; равно LSHFunctionT* x;

И да, PLSHFunctionT* x; равно LSHFunctionT** x;

Цель typedef - присвоитьновые имена для существующих типов.Вы можете определить typedef int lol; и объявить переменную lol i;, но компилятор все равно учтет ее int.

Вам также следует проверить следующие вопросы:
Когда мне следует использовать typedef в C ++?
Почему имена структур должны иметь typedef?

Надеюсь, это поможет.

1 голос
/ 06 февраля 2012

Нет никакой разницы между двумя на поверхности. Однако с указателем typedef нет способа объявить его указателем на const, просто const-pointer-to-non-const.

Например, вы можете сказать

const LSHFunctionT* const_ptr;, но const PLSHFunctionT const_ptr2; делает указатель const, а НЕ pointee.

Наконец, обратите внимание, что в C ++ все это имеет сомнительную законность, поскольку имена, начинающиеся с _<capital>, зарезервированы для реализации, и что typedefs почти никогда не используются таким образом.

1 голос
/ 06 февраля 2012

Разница в акценте.Как правило, неявная запись * может указывать на то, что PLSHFunctionT предназначена для использования в качестве дескриптора (без знания / доступа к элементам структуры).Если * явно написано, как в LSHFunctionT * myPointer, это может указывать массив или структуру, которая должна использоваться для доступа к значениям.

0 голосов
/ 06 февраля 2012

Эти декларации одинаковы. Подход указатель-тип-определение улучшает читабельность кода в некоторых случаях. Можно утверждать, что это:

PLSHFunctionT calls[];

легче читать, чем это:

LSHFunctionT *calls[];
0 голосов
/ 06 февраля 2012

Да.Они точно такие же, даже во втором случае.

Я лично предпочитаю явно использовать *, если хочу объявить указатель.Это делает код читабельным, в большинстве случаев.Использование typedef типа указателя обычно снижает читабельность, хотя иногда это может повысить читабельность, особенно когда вы работаете, скажем, с Windows API.

0 голосов
/ 06 февраля 2012

Кажется, нет никакой разницы. Существуют разные стили программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...