2015-09-18 32 views
5

我目前在學習關於C語言中的struct數據結構,以及如何用typedef關鍵字前綴這個結構。這將導致實際結構的變量名被放置在不同的命名空間在幾個不同的引用解釋:沒有typedef關鍵字的結構體

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; 
} 

在這個例子中,我可以通過synth變量訪問struct數據結構名稱;然而,在我看到的例子中,爲了讓我能夠做到這一點,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的大小。

在這種情況下,兩個返回相同的大小。

更新:

使用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; 

更新2:

Linux kernel coding style

第5章:Typedefs

請不要使用諸如「vps_t」之類的內容。 這是一個錯誤使用typedef結構和指針。當你看到一個

vps_t a; 

在源代碼中,這是什麼意思? 相反,如果它說

struct virtual_container *a; 

你實際上可以告訴「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

我能夠通過synth變量名訪問struct data structure;然而,在我看到的例子中,爲了讓我能夠做到這一點,struct需要以typedef開頭。

不,這不是你的想法。這不是因爲typedef,您可以通過synth訪問結構成員。

在這個例子中,typedef沒有使用,但我仍然能夠通過synth引用此結構。

這是因爲synth本身,因爲它是struct variable,你可以訪問struct的成員。

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 demo t; 

在這兩種情況下,如果您去除typedef那麼你也可以訪問結構與synthtypedef在沒有任何作用那。

2

對於C struct類型,typedef關鍵字是不必要的。它給你的唯一好處是它爲該類型創建了一個單詞的名稱。

在你的榜樣聲明:

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

實際上是2點聲明,一個是類型struct demo,以及一個該類型的命名synth的對象。這可能更清楚地寫成兩個單獨的聲明:

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

struct demo synth; 

第一個聲明創建一個新的結構類型。它的名字是struct demo。第二個定義了該類型的對象,名爲synth

鑑於這些聲明,標識符demo本身是沒有意義的;它是一個結構標記,它只有在關鍵字struct之前有意義。

synth另一方面,是對象(變量)的名稱。在關鍵字struct之前不需要,實際上也不可以。

如果您願意,可以添加typedef以給struct demo另一個名稱。 (A typedef沒有定義一個新類型,它只是定義了一個新的名字,一個別名,爲現有類型。)例如,常見的成語是:

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

像你原來的聲明,這實際上是兩個聲明,創建類型struct demostruct定義以及爲該類型創建新名稱demotypedef。它可以寫成:

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

其次,如果你喜歡,由對象聲明:

demo synth; 

(請注意,有沒有必要爲結構標記和typedef名稱是不同的,並且恕我直言,它更清楚他們是相同的。)

是否使用typedef結構類型的選擇主要是風格之一。我個人的偏好是而不是使用typedef爲結構; struct demo已經有了一個非常好的名字。但是很多程序員更喜歡使用一個名稱作爲單個標識符。

+0

@JensGustedt:修正,謝謝! –

0

typedef關鍵字: 有一種更簡單的方法來定義結構,或者你可以「別名」你創建的類型。例如:

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

現在,您可以直接使用書籍來定義書籍類型的變量,而無需使用struct關鍵字。以下是例子:

Books Book1, Book2; 

您可以使用非結構typedef關鍵字以及如下:

typedef long int *pint32; 

pint32 x, y, z; 

X,Y和Z都指向長整型