Соглашение об именах при использовании STRUCT в C - PullRequest
19 голосов
/ 06 апреля 2011

Я изучаю C и нахожу, что кто-то определил структуру, перед именем структуры стоит _.Это мой первый раз, может кто-нибудь рассказать мне немного больше об этом?Почему кто-то использует _aStructName вместо aStructName, в чем преимущества?

struct _huffmanNode {
    int value;
    uint32_t frequency;

    int hasChild;
    struct _huffmanNode *child[2];

    struct _huffmanNode *next;
};

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

typedef struct HuffCode_ {

unsigned char      used;
unsigned short     code;
unsigned char      size;

} HuffCode;

Ответы [ 4 ]

12 голосов
/ 06 апреля 2011

Пользовательский код не приносит никакой пользы, он просто ужасен.Во втором примере HuffCode_ даже не требуется, так как тип struct уже назван typedef.

. Единственные места, где это может быть полезно:

  1. Когда StructName уже используется, StructName_ дает другое имя (но вы действительно должны придумать лучшее имя).
  2. Идентификаторы в стандартной библиотеке C, которые не определеныстандарт не должен конфликтовать с идентификаторами кода пользователя.Поэтому создатели библиотеки C используют префикс _ в надежде, что пользователи не будут его использовать.К сожалению, некоторые пользователи.
  3. В очень старых компиляторах может быть полезно дать struct имя, отличное от того, которое используется в typedef.Вам нужно и typedef, и другое имя, если вы строите связанную структуру ( пример ).
5 голосов
/ 02 июня 2014

Я думаю, что это сделано в основном из-за очень ошибочной идеи, что структура и тип не могут иметь одно и то же имя.Другими словами, это так или иначе

struct MyStruct;
typedef struct MyStruct MyStruct;

будет сталкиваться странным образом, потому что struct и typedef имеют одно и то же имя.Это неправильно в C. Имя структуры считается тегом , тогда как typedef создает имя типа.Они живут в двух разных пространствах имен и не будут сталкиваться.На мой взгляд, гораздо больше смысла в том, чтобы тег структуры совпадал с typedef, при условии, что вы вообще используете typedef.В C вы всегда должны ссылаться на структуру с ключевым словом struct.Например, если вы определяете

struct MyStruct;

, но не делаете typedef, то следующее недопустимо:

void myfunction()
{
  MyStruct var;   /* compiler error: MyStruct is not defined. */
  struct MyStruct var2; /* this is OK, MyStruct is a valid name for a struct. */
}

Если вы хотите определить переменные (или аргументы) типа MyStruct в C, вы должны предоставить typedef:

typedef struct MyStruct MyStruct;

void myfunction2()
{
  MyStruct var;  /* this is ok now */
  struct MyStruct var2; /* this is still ok too */
}

Во втором примере var и var2 имеют одинаковый тип,хотя это не очевидно.Действительно, если бы typedef был изменен, они больше не имели бы тот же тип.Остерегайтесь этого!Это может вызвать некоторые интересные ошибки при изменении определений типов.

В C ++ определение структуры по существу создает неявный typedef, так что оба из приведенных выше фрагментов кода компилируются.В C ++ нет принципиальной разницы между именем структуры (или тегом) и именем типа.Что, на мой взгляд, является еще одной веской причиной для того, чтобы называть их одинаково, особенно если вы ожидаете, что ваш модуль C может в какой-то момент использоваться некоторым кодом C ++.

5 голосов
/ 06 апреля 2011

Большую часть времени в прямом С люди любят печатать свои структуры так, чтобы они не выглядели так ужасно. Поэтому они называют саму структуру чем-то ужасным, а typedef - чистым. Обычно соглашение, которое я видел в мире GNU:

typedef struct mytype_t
{
    int field;
    char field2;
} mytype;
1 голос
/ 06 апреля 2011

Я использую вариант второго примера:

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