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;
答案 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;
变量form
和structure
的类型不同;例如,你不能合法地将一个分配给另一个,或者将它们中的任何一个传递给另一个函数,等等。
更典型的情况是,您要么为结构类型指定标记(struct three
),要么使用typedef
(typedef 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;
两个变量var1
和var2
不是正式的相同类型。 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;
^
$
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;
}