В чем преимущество typedef в C? - PullRequest
4 голосов
/ 14 октября 2010
typedef struct _VIDEO_STREAM_CONFIG_CAPS
{
  GUID guid;
  ULONG VideoStandard;
  SIZE InputSize;
  SIZE MinCroppingSize;
  SIZE MaxCroppingSize;
  int CropGranularityX;
  int CropGranularityY;
  int CropAlignX;
  int CropAlignY;
  SIZE MinOutputSize;
  SIZE MaxOutputSize;
  int OutputGranularityX;
  int OutputGranularityY;
  int StretchTapsX;
  int StretchTapsY;
  int ShrinkTapsX;
  int ShrinkTapsY;
  LONGLONG MinFrameInterval;
  LONGLONG MaxFrameInterval;
  LONG MinBitsPerSecond;
  LONG MaxBitsPerSecond;
}  VIDEO_STREAM_CONFIG_CAPS;

Почему бы не определить structure VIDEO_STREAM_CONFIG_CAPS напрямую вместо _VIDEO_STREAM_CONFIG_CAPS?

Ответы [ 3 ]

5 голосов
/ 14 октября 2010

Очень просто (по крайней мере, для меня), потому что некоторым людям нравится иметь возможность обрабатывать пользовательские типы как «первичные» типы.

Точно так же, как я не хотел бы говорить:

struct int i;

Я предпочитаю:

VIDEO_STREAM_CONFIG_CAPS vscc;

:

struct VIDEO_STREAM_CONFIG_CAPS vscc;

На самом деле, я обычно вообще избавляюсь от тега структуры, предпочитая:

typedef struct {
    GUID guid;
    ULONG VideoStandard;
    :
} VIDEO_STREAM_CONFIG_CAPS;

Единственный раз, когда я обычно использую тег, это когда я должен ссылаться на тип в самом определении типа, например в связанных списках:

typedef struct sNode {
    char paylod[128];
    struct sNode *next;
} tNode;

Это потому, что во время созданияПо определению, tNode еще не существует, но struct sNode существует (вы можете думать об этом как о простой последовательности, если это облегчает задачу - struct sNode создается в строке 1 выше, tNode в строке 4, чтоозначает, что в строке 3, где вы создаете указатель next, вы должны использовать имя структуры).

В случае, когда вы цитируете, тег структуры является избыточным, по крайней мере, в показанном коде.Неясно, объявляет ли какой-либо другой фрагмент кода переменную с именем структуры, а не с именем typedef.

3 голосов
/ 14 октября 2010

В этом случае каждый раз, когда объявляется переменная типа VIDEO_STREAM_CONFIG_CAPS, требуется следующий синтаксис:

struct VIDEO_STREAM_CONFIG_CAPS vscc;

С typedef struct это:

VIDEO_STREAM_CONFIG_CAPS vscc;
3 голосов
/ 14 октября 2010

В c вы должны поместить struct перед объявлением типа структуры.Без этого typedef вам придется писать struct VIDEO_STREAM_CONFIG_CAPS каждый раз, когда вы захотите его использовать.С помощью typedef вы можете сказать просто VIDEO_STREAM_CONFIG_CAPS, как в c ++.

struct a {};

struct a A;

ИЛИ

typedef struct a {} a;

a A;
...