Разница в объявлении структур - PullRequest
2 голосов
/ 11 июня 2009

Я использовал свою структуру, как это. Я не люблю печатать, потому что могу скрыть ошибки. Однако я просматривал некоторый пример кода и видел структуры, объявленные так. И это нормальный способ, которым я их объявляю.

struct person
{
     int age;
     char name[32];
};

используя вот так:

    struct person person_a;
    person_a.age = 20;
    etc.

Однако я видел структуры, объявленные так:

struct 
{
     int age;
     char name[32];
}person;

и

struct _person
{
     int age;
     char name[32];
}person;

В чем разница между всеми этими различными техниками и как бы вы решили, когда лучше всего использовать каждый конкретный метод.

Большое спасибо за любые предложения,

Ответы [ 6 ]

17 голосов
/ 11 июня 2009

Это:

struct 
{
    int age;
    char name[32];
}person;

объявляет переменную person, которая является struct. У struct нет имени, но вы все равно используете переменную person таким же образом.

struct _person
{
    int age;
    char name[32];
}person;

Это идентично:

struct _person
{
    int age;
    char name[32];
};
struct _person person;

Он объявляет struct с именем _person, а затем создает переменную с именем person типа struct _person.

2 голосов
/ 11 июня 2009

В первом случае (из второго примера) вы будете использовать этот подход, если уверены, что вам нужен еще один объект для этой структуры. Это выглядит чисто и быстро для кодирования:)

Для второго случая у вас есть готовый объект с именем 'person' и возможность создать объект позже как

 struct _person object2

Это объясняет, почему вы будете использовать любой из этих подходов. Разница между ними была объяснена выше.

2 голосов
/ 11 июня 2009

В обеих последних двух структурах вы выделили хранилище для структуры с именем person.

Что я имею в виду, если у вас есть что-то вроде этого:

struct person
{
     int age;
     char name[32];
};

Это просто декларация; Распределение переменных не существует и, следовательно, не может использоваться внутри кода. Вы можете начать использовать эту структуру после того, как объявите следующее:

struct person p1;

Тогда p1 можно использовать p1.age или p1.name и т. Д.

В терминах реального кода вместо

struct _person
{
     int age;
     char name[32];
}person;

мы обычно видим

typedef struct _person
{
     int age;
     char name[32];
} person_t;

В этом случае мы можем сохранить типизацию и, что более важно, структура ведет себя как любой другой встроенный тип, например int и т. Д. Например,

person_t p1;

person_t * p1;

И т. Д.

1 голос
/ 11 июня 2009

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

В реальном C-коде структуры часто объявляются по прагматическим причинам Пурли, которые являются локальными по объему. Например, форматирование данных, которые будут скопированы в буфер. В этих случаях очень удобно и логично объединить тип структуры и объявление переменной. Кроме того, использование анонимного объявления для типа структуры позволяет избежать загромождения пространства имен ненужным именем.

У меня есть один критерий этих примеров: в C имена с начальным подчеркиванием считаются зарезервированными для поставщиков компиляторов по соглашению. Поэтому я не думаю, что последний пример согласуется с передовой практикой.

1 голос
/ 11 июня 2009

1-й код просто создает структуру person.
Второй код создает экземпляр структуры person с именем person_a.
Третий код создает безымянную структуру и ее экземпляр с именем person. Четвёртый код создает структуру с именем _person и его экземпляр с именем person.

1 голос
/ 11 июня 2009

Там действительно нет магии,

struct person
{
     int age;
     char name[32];
} var;

- это то же самое, что и

struct person
{
     int age;
     char name[32];
};
struct person var;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...