我正在使用我的结构。我不喜欢typedef,因为我告诉它可以隐藏错误。 但是,我正在查看一些示例代码,我看到这样的结构声明了。这是我宣布它们的正常方式。
struct person
{
int age;
char name[32];
};
像这样使用:
struct person person_a;
person_a.age = 20;
etc.
但是,我看到结构声明如下:
struct
{
int age;
char name[32];
}person;
和
struct _person
{
int age;
char name[32];
}person;
所有这些不同技术之间的区别是什么,以及您如何决定何时最好使用每种技术。
非常感谢任何建议,
答案 0 :(得分:17)
此:
struct
{
int age;
char name[32];
}person;
声明变量person
,即struct
。 struct
没有名称,但您仍然以相同的方式使用person
变量。
struct _person
{
int age;
char name[32];
}person;
这与:
相同struct _person
{
int age;
char name[32];
};
struct _person person;
它声明struct
名为_person
,然后创建一个名为person
的{{1}}类型的变量。
答案 1 :(得分:2)
在最后两个结构中,您已为名为person的结构分配了存储空间。
我的意思是如果你有这样的东西:
struct person
{
int age;
char name[32];
};
这只是一个宣言;没有变量分配,因此不能在代码中使用。在声明如下后,您可以开始使用此结构:
struct person p1;
然后,p1可以使用p1.age或p1.name等。
就真实世界的代码而言,而不是
struct _person
{
int age;
char name[32];
}person;
我们通常会看到
typedef struct _person
{
int age;
char name[32];
} person_t;
在这种情况下,我们可以节省输入,更重要的是,结构的行为与任何其他内置类型(如int等)一样。 例如,
person_t p1;
person_t * p1;
等等。
答案 2 :(得分:2)
对于第一种情况(第二个示例),如果您确定需要此结构的另一个对象,则将使用此方法。这看起来很干净,代码很快:)
对于第二种情况,你有一个名为'person'的现成对象和一个稍后创建对象的选项
struct _person object2
这是为了解释为什么要使用这两种方法。它们之间的区别已经在上面解释过了。
答案 3 :(得分:1)
真的没有魔力,
struct person
{
int age;
char name[32];
} var;
与以下内容相同:
struct person
{
int age;
char name[32];
};
struct person var;
答案 4 :(得分:1)
第一个代码只是创建人员结构 第二个代码创建一个名为person_a的person结构实例 第三个代码创建一个未命名的结构,并将其实例称为person。 第四个代码创建一个名为_person的结构,并将其实例命名为person。
答案 5 :(得分:1)
如果结构定义的目的是声明一个在本地模块之外有意义的逻辑数据结构,那么你可能会在头文件中看到第一个结构。
在现实世界的C代码中,结构通常是出于本地范围内的purley语用原因而声明的。例如,格式化将复制到缓冲区中的数据。在这些情况下,合并结构类型和变量声明非常方便和合乎逻辑。此外,对结构类型使用anoymous声明可以避免使用不需要的名称来混淆命名空间。
我确实对这些示例有一个批评:在C中,具有前导下划线的名称被认为是按照惯例为编译器供应商保留的。所以我认为最后一个例子与最佳实践不一致。