![](/img/trans.png)
[英]What is the difference between this two different ways to implement double linked list?
[英]What is the difference between these two ways of writing a structure?
struct one
{
int member;
};
struct two
{
int member;
} structure;
如果要在main()
函數中調用上述結構,則在第一種情況下,我需要將struct one
命名為我選擇的任意隨機名稱,然后按如下所示調用其成員:
int main() {
struct one random_name;
random_name.member = 1;
}
在第二種情況下,我已經命名了structure
因此可以直接使用這種名稱structure
來調用成員:
int main() {
structure.member = 1;
}
下面的版本有效嗎?還是必須將typedef
放在struct
前面?
struct {
int member;
} structure;
始終使用int
作為結構成員的類型,然后:
struct one
{
int member;
};
這是對struct one
類型的完美定義。 它沒有定義struct one
類型的變量; 它只是一種類型,可以在以后的翻譯單元中使用。
struct two
{
int member;
} structure;
這是對struct two
的完美定義,也是對structure
struct two
的可變structure
的定義。
如果要在
main()
函數中調用上述結構,則在第一種情況下,我需要將struct one
命名為我選擇的任意隨機名稱,然后按如下所示調用其成員:
int main(void)
{
struct one random_name;
random_name.member = 1;
}
如果要使用struct one
類型的變量,則必須對其進行定義,並且這樣做的方式很好。 您不會“呼叫”結構的成員。 您使用它們。
在第二種情況下,我已經命名了
structure
因此可以直接使用這種名稱結構來調用成員:
int main(void)
{
structure.member = 1;
}
這也是有效的,因為您在定義類型struct two
的同時定義了變量structure
。
以下版本是否有效?還是我必須將
typedef
放在結構前面:
struct
{
int member;
} structure;
這也是合法的代碼。 它定義了一個匿名結構類型,並定義了該類型的單個變量。 它是該類型中唯一可以存在的變量,但是偶爾使用它是有用的。
請注意,如果最后一個structure
后面是:
struct
{
int member;
} form;
變量form
和structure
的類型不同; 例如,您不能合法地將一個分配給另一個,也不能將其中任何一個傳遞給另一個函數,等等。
更典型地,您可以給結構類型加上標簽( struct three
)或使用typedef
( typedef struct { int member; } four;
)或同時使用兩種類型( typedef struct five { int member; } five;
標簽和類型名稱與我所顯示的名稱相同,但是在類型和標簽上使用不同的名稱也有廣泛的傳統)。
所以用
typedef struct { int member; } structure;
typedef struct { int member; } structure;
,可以在main()
創建一個或多個類型structure
變量,像這樣嗎?structure first_var; structure second_var;
這是完全合法的。 您可以改寫:
structure first_var, second_var;
盡管許多人希望每個聲明都使用一個變量。
而如果我們不使用
typedef
而只是使用struct { int member; }structure;
struct { int member; }structure;
那么我只有一個具有名稱structure
變量,並且只能在main()
使用它,例如structure.member = 1;
並且不能創造更多。
或多或少。 你可以寫:
struct { int member; } var1, var2, … varN;
現在您有多個相同類型的變量。 但是,盡管您可以編寫:
struct { int member; } var1;
struct { int member; } var2;
這兩個變量var1
和var2
正式不是同一類型。 在標准6.2.7節中,兼容類型和復合類型中的措辭有些復雜,這可能會讓您望而卻步,但是GCC 4.9.1 set fussy說:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -c tagless.c
tagless.c: In function ‘main’:
tagless.c:13:10: error: incompatible types when assigning to type ‘struct <anonymous>’ from type ‘struct <anonymous>’
var1 = var2;
^
$
struct
{
int member;
} var1;
struct
{
int member;
} var2;
int main(void)
{
var1.member = 1;
var2.member = 2;
var1 = var2;
return 0;
}
two more doubts:::::::
而如果我們不使用typedef,而只是使用struct {int member;} structure; 然后我只有一個具有名稱結構的變量,並且只能在主結構中使用它。member = 1; 並且無法創造更多–
回答:聲明結構后,您始終可以創建多個變量,因此,如果不使用typedef,則結構只能有一個變量。 例如:
struct structure
{
int number;
};
int main()
{
structure var1, var2, var3; //...any number of variables can be declared here.
var1.number = 30;
var2.number = 45;
var3.number = 90;
printf("\nvar1 = %d, var2 = %d, var3 = %d\n", var1.number, var2.number, var3.number);
return 0;
}
For a better understanding of typedef,
Consider this example :
1.
struct structure
{
int number;
};
typedef struct structure structure;
2.
typedef struct structure
{
int number;
}structure;
---------------------
以上兩個聲明都是等效的。
typedef用於定義變量或關鍵字的新名稱。
假設萬一您的結構聲明是這樣的:
struct this_is_my_structure
{
int number;
};
那么每次您聲明此結構的實例時,都必須在實例前面使用該長名稱,例如:
int main()
{
struct this_is_my_structure var1; // you dont want to write such long types for variables
var1.number = 23;
return 0;
};
You will find typedef helpful here :
typedef struct this_is_my_structure structure;
現在,每次您要聲明“ this_is_my_structure”類型的實例時,您要做的就是以下操作:
int main()
{
structure var1;
var1.number = 23;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.