这两种结构编写方式有什么区别?

时间:2014-08-05 01:06:54

标签: c 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;

2 个答案:

答案 0 :(得分:4)

使用int作为整个结构成员的类型,然后:

struct one
{
    int member;
};

这是struct one类型的完美定义。它没有定义struct one类型的变量;它只是一种可以在以后在翻译单元中使用的类型。

struct two
{
    int member;
} structure;

这是struct two类型的完美定义,也是类型structure的变量struct two的定义。

  

如果我想在main()函数中调用上述结构,那么在第一种情况下,我需要将struct one命名为我选择的任何随机名称,然后再调用其成员这样:

int main(void)
{
    struct one random_name;

    random_name.member = 1;
}

如果你想使用struct one类型的变量,你必须定义它,你已经这样做的方式很好。你没有打电话给'结构成员。你使用它们。

  

在第二种情况下,我已经命名structure,所以我可以直接调用名称结构的成员,如下所示:

int main(void)
{
    structure.member = 1;
}

这也是有效的,因为您在定义类型structure的同时定义了变量struct two

  

以下版本是否有效,或者我必须将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;,在main()中创建一个或多个structure类型的变量是可能的,就像这样?

structure first_var;
structure second_var;

这完全合法。你可以写一下:

structure first_var, second_var;

虽然许多人更喜欢每个声明一个变量。

  

然而,如果我们不使用typedef而只是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设置挑剔说:

$ 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;
          ^
$

tagless.c

struct
{
    int member;
} var1;
struct
{
    int member;
} var2;
int main(void)
{
    var1.member = 1;
    var2.member = 2;
    var1 = var2;
    return 0;
}

答案 1 :(得分:0)

two more doubts:::::::

然而,如果我们不使用typedef而只是做struct {int member;}结构; 然后我只得到一个具有名称结构的变量,并且只能使用它 main structure.member = 1; 并且无法创建更多 -

Ans:一旦声明了结构,你总是可以创建多个变量,所以如果你不使用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;
    }