2015-09-18 5 views
5

В настоящее время я изучаю структуру данных struct в языке C и как можно префикс этой структуры с помощью ключевого слова typedef. Это приводит к тому, имена переменных фактической структуры должны быть размещены в разных пространствах имен, как описано в нескольких различных ссылок:struct without typedef keyword

Difference between 'struct' and 'typedef struct' in C++?

typedef struct vs struct definitions

Однако неясно, что происходит с примером, что Я работаю с:

#include <stdio.h> 

struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} synth; 

int main() 
{  
    printf("Size of struct: %i\n", sizeof(struct demo)); 
    printf("Size of struct: %i\n", sizeof(synth)); 
    return 0; 
} 

в этом примере я могу получить доступ к структуре struct данных через переменную synth имя; однако в примерах, которые я видел, для того, чтобы я мог это сделать, struct должен быть предваряем typedef. В этом примере typedef не используется, и все же я все еще могу ссылаться на эту структуру через synth. Мне интересно, что именно происходит, что C позволяет мне это делать? Любое объяснение будет оценено. Приветствия.

+0

Вы знакомы с чем 'typedef' делает? – ameyCU

+0

'sizeof' дает результат типа' size_t'. Правильной строкой формата для значения 'size_t' является'% zu', а не '% i' (что для' int'). –

+0

Спасибо за информацию 'size_t'. Насколько я понимаю, что означает 'typedef', так это то, что он создает переменную в отдельном пространстве имен, что позволяет ссылаться на структуру без необходимости использовать' struct demo'. Не уверен, что что-то еще происходит за кулисами. –

ответ

6
struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} synth; 

То же самый, как:

// declare struct demo 
struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
}; 

// define struct variable synth 
struct demo synth; 

Теперь вы можете получить доступ элементов этой структуры, пример:

synth.sequential = 1; 

sizeof(struct demo) возвращает размер struct demo.

sizeof(synth) возвращает размер конкретного примера synth.

В этом случае оба возвращают одинаковый размер.

Update:

Использование typedef это может выглядеть следующим образом:

// declare new type demo 
typedef struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} demo_t; 

// define demo_t variable synth 
demo_t synth; 

Update 2:

От Linux kernel coding style:

Глава 5: Typedefs

Пожалуйста, не используйте такие вещи, как «vps_t». Это ошибка использовать typedef для структур и указатели. Когда вы видите

vps_t a; 

в источнике, что это значит? В отличие от этого, если он говорит

struct virtual_container *a; 

вы можете сказать, что «а».

0

Это то же самое, как если бы вы объявили:

int i; 

И сделал это:

printf("Size of int: %i\n", sizeof(int)); 
printf("Size of int: %i\n", sizeof(i)); 

Две линии напечатает то же значение.

Если у вас это:

typedef struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
} mydemo; 

mydemo synth; 

Вы можете сделать это:

printf("Size of struct: %i\n", sizeof(struct demo)); 
printf("Size of struct: %i\n", sizeof(mydemo)); 
printf("Size of struct: %i\n", sizeof(synth)); 

И они также будут печатать то же самое.

0

Я могу получить доступ к struct data structure через имя переменной synth; однако в примерах, которые я видел, для того, чтобы я мог это сделать, struct должен быть предваряем typedef.

Нет, это не то, что вы думаете. Не из-за typedef вы можете получить доступ к элементам структуры с помощью synth.

В этом примере typedef не используется, и все же я до сих пор в состоянии ссылаться на эту структуру через synth.

Это из-за synth сам, как это struct variable, что вы можете получить доступ к членам структуры.

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

Пример -

typedef struct A{ 
    char B; 
    int C; 
}D ; 

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

Без typedef -

struct demo 
{ 
    short low_pass_vcf; 
    short filter_coupler; 
    short reverb; 
    short sequential; 
}synth; 

synth переменная структура и вы можете получить доступ к членам структуры. Но в этом не typedef, если вы хотите объявить переменную STRUCT вы должны объявить, как это -

struct demo t; 

В любом из случае, если даже удалить typedef то и вы можете получить доступ-структуру с synth, typedef не играет никакой роли в что.

2

Ключевое слово typedef не обязательно для C struct. Единственное преимущество, которое это дает вам, заключается в том, что он создает однословное имя для типа.

Декларация в вашем примере:

struct demo 
{ 
    /* ... */ 
} synth; 

фактически два декларации, один для типа struct demo, и один для объекта этого типа с именем synth. Это, возможно, более четко написано как две отдельные декларации:

struct demo 
{ 
    /* ... */ 
}; 

struct demo synth; 

Первое объявление создает новый тип структуры. Его имя struct demo. Второй определяет объект такого типа, который называется synth.

Идентификатор demo сам по себе, учитывая эти декларации, не имеет смысла; это struct tag, и это имеет смысл только тогда, когда предшествует ключевое слово struct.

synth, с другой стороны, является именем объекта (переменная). Этого не должно быть, и на самом деле не может быть, предшествующего ключевому слову struct.

Вы можете, если хотите, добавить typedef, чтобы дать тип struct demo второе имя. (A typedef не определяет новый тип, он просто определяет новое имя, псевдоним для существующего типа). Например, общая идиома:

typedef struct demo { 
    /* ... */ 
} demo; 

Как исходной декларации, это действительно два декларации, определение struct, которое создает тип struct demo и typedef, который создает для этого типа новое имя demo. Это может быть записано как:

struct demo { 
    /* ... */ 
}; 
typedef struct demo demo; 

последовал, если вы хотите, описание объекта:

demo synth; 

(Обратите внимание, что нет никакой необходимости в STRUCT тега и имя ЬурейеГо, чтобы быть различны, ИМХО, им будет ясно, что они будут одинаковыми.)

Выбор типа использования typedef для типов конструкций в основном является одним из стилей. Мои предпочтения: неtypedef для конструкций; struct demo уже имеет прекрасное имя. Но многие программисты предпочитают иметь имя, которое является одним идентификатором.

+0

@JensGustedt: Исправлено, спасибо! –

0

Ключевое слово typedef: Существует более простой способ определения структур, или вы можете создавать типы «псевдонима». Например:

typedef struct 
{ 
    char title[50]; 
    char author[50]; 
    char subject[100]; 
    int book_id; 
}Books; 

Теперь вы можете использовать Книги непосредственно для определения переменных типа Books без использования ключевого слова struct.Ниже приводится пример:

Books Book1, Book2; 

Вы можете использовать ЬурейеЕ ключевое слово не-структур, а также следующим образом:

typedef long int *pint32; 

pint32 x, y, z; 

х, у и г являются все указатели на длинные Интс