簡體   English   中英

這兩種編寫結構的方式有什么區別?

[英]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;

變量formstructure的類型不同; 例如,您不能合法地將一個分配給另一個,也不能將其中任何一個傳遞給另一個函數,等等。

更典型地,您可以給結構類型加上標簽( struct three )或使用typedeftypedef 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;

這兩個變量var1var2正式不是同一類型。 在標准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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM