2013-05-13 125 views
0

像往常一樣,Wikipedia's article on structs不明確。它提供了,因爲這對於結構的語法:澄清C結構語法

[typedef] struct [struct_name] 
{ 
    type attribute; 
    type attribute2; 
    /* ... */ 
    [struct struct_name *struct_instance;] 
} [struct_name_t] [struct_instance]; 
  • 什麼會typedef關鍵字在這裏做?
  • [struct_name]是什麼意思? (它是你給新結構數據類型的名字嗎?)
  • [struct_name_t]是什麼意思?
  • [struct_instance]是什麼意思? (它是否創建一個單一的結構實例?)
  • 我假設[struct struct_name *struct_instance;]在結構中創建一個指針,指向結構的第二個實例)。正確?

我非常感謝一個例子:假設我有三個文件:main.c,sub.c和sub.h.我想在sub.h中聲明一個結構體的實例,並在sub.c中實例化和使用它。說我想要一個歌曲類型結構,成員char name[20]char artist[10],並說我想做一個實例,mySong,{「我唱歌」,「我」},這將如何看在sub.c和sub.h?

感謝

+1

請參見[this](http://stackoverflow.com/questions/4698600/whats-the-syntactically-proper-way-to-declare-a-c-struct)。 – 2013-05-13 12:19:56

+1

flashback heh:http:// stackoverflow。com/questions/16415734/using-typedef-with-an-instance-declaration-wiki-error – 2013-05-13 12:27:36

+0

非常好,謝謝你,雖然它沒有回答我所有的問題,但總是有很好的解釋 – Jodes 2013-05-13 12:28:48

回答

3

•What would the typedef keyword do here?

這將允許你創建你的結構法的類型定義,就像任何其他類型。這使您不必每次輸入struct xxx struct_name。你不需要這個,因此[]

•What does the [struct_name] mean? (Is it the name you're giving to the new struct data type?)

是的,如果你選擇了。你也可以創建一個無名結構,所以你不需要給它命名。

•What does the [struct_name_t] mean?

這就是typedef定義的名稱,如果你選擇的typedef的結構

•what does the [struct_instance] mean? (Is it creating a single instance of the struct?)

是的,它是用於創建sturct的一個或多個實例(S)

•I presume [struct struct_name *struct_instance;] creates a pointer in the struct which would point to a second instance of the struct). Correct?

對,這對於鏈接中的「下一個」類型指針是有用的名單。

結構例如:

typedef struct foo{ 
    int count; 
    struct foo *next; 
} foo_t myfoo; 

是其填充在一個例子;這允許你聲明一個新的結構體:

foo_t new_foo_struct; 

由於typedef和typedef'd名稱。如果忽略那些像這樣:

struct foo{ 
    int count; 
    struct foo *next; 
} myfoo; 

現在你不得不使用struct關鍵字爲每個實例,如:

struct foo new_foo_struct; 

打破它在超過1文件:

/*sub.h*/ 
typedef struct{ 
char name[20]; 
char artist[10]; 
}song; 

然後在源:

/*sub.c*/ 
#include "sub.h" 

/*this needs to go into a function or something...*/ 
song mysong; 
strcpy(mysong.name, "Mesinging"); 
strcpy(mysong.artist, "Me"); 
+0

非常好,謝謝。然而,我的問題仍然是,我將如何在.h文件中聲明它,然後在.c文件中指定它?類型和實例 – Jodes 2013-05-13 12:27:12

1
sub.h 
------ 
typedef struct{ 
char name[20]; 
char artist[10]; 
}song; 


sub.c 
---- 
song mysong={"Me Singing","Me"}; 
0
typedef struct struct_name 
{ 
    char name[20]; 
    char artist[10]; 
}struct_name_t structInstance; 

的typedef - 這意味着你正在創建一個新的類型(struct_name_t

所以,在C代碼,你可以創建這樣一個實例:

struct_name_t myVariable; 

或你可以明確寫出:

struct struct_name myVariable; 

structInstance最後意味着您想在您定義它的同一時刻創建結構實例(並且該變量的名稱是structInstance)。這不是你會一直使用的東西,但它在某些情況下很有用。

如果你想創建結構的實例,並指定/在創建時初始化的成員,你可以做這樣的:

struct_name_t myVariable = { "Foo", "bar" }; 

「名稱」成員將包含「富」和藝術家成員將包含「酒吧」。

注: 如果你這樣寫:

struct_name_t myVariable = { 0 }; 

,將填補你用零整個結構!

2

那篇文章只是錯誤地混合了不同的概念,現在糾正了這一點。一個結構是通過

struct tagname { 
    ... fields ... 
}; 

宣稱這只是它,只有那tagname部分是在某些情況下是可選的。

此外,您可以

  • 聲明爲struct類型的別名通過typedef
  • 或「一氣呵成」的struct

的變量,但我不認爲這是很好的風格,應該分開。