我目前正在了解C中的struct
数据结构,以及如何使用typedef
关键字为此结构添加前言。这会导致实际结构的变量名称放在不同的名称空间中,如几个不同的引用中所述:
Difference between 'struct' and 'typedef struct' in C++?
typedef struct vs struct definitions
但是,目前还不清楚我正在使用的示例中发生了什么:
#include <stdio.h>
struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
} synth;
int main()
{
printf("Size of struct: %i\n", sizeof(struct demo));
printf("Size of struct: %i\n", sizeof(synth));
return 0;
}
在此示例中,我可以通过struct
变量名访问synth
数据结构;但是,在我看到的示例中,为了使我能够执行此操作,struct
需要以typedef
开头。在此示例中,未使用typedef
,但我仍然可以通过synth
引用此结构。我想知道C允许我这样做到底发生了什么?任何解释将不胜感激。欢呼声。
答案 0 :(得分:8)
struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
} synth;
与:
相同// declare struct demo
struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
};
// define struct variable synth
struct demo synth;
现在您可以访问结构成员,例如:
synth.sequential = 1;
sizeof(struct demo)
会返回struct demo
的大小。
sizeof(synth)
返回具体实例synth
的大小。
在这种情况下,两者都返回相同的大小。
<强>更新强>
使用typedef
可能如下所示:
// declare new type demo
typedef struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
} demo_t;
// define demo_t variable synth
demo_t synth;
更新2:
第5章:Typedef
请不要使用“
vps_t
”之类的内容。 使用typedef作为结构和指针是 错误。当你看到vps_t a;
在源头,这是什么意思? 相反,如果它说
struct virtual_container *a;
你实际上可以说出“a”是什么。
答案 1 :(得分:3)
C typedef
类型不需要struct
关键字。它给你的唯一好处是它为类型创建一个单词的名称。
示例中的声明:
struct demo
{
/* ... */
} synth;
实际上是两个声明,一个用于类型struct demo
,另一个用于该类型的对象,名为synth
。它可能更清楚地写成两个单独的声明:
struct demo
{
/* ... */
};
struct demo synth;
第一个声明创建一个新的结构类型。它的名字是struct demo
。第二个定义了该类型的对象,名为synth
。
鉴于这些声明,标识符demo
本身是没有意义的;它是一个 struct标签,只有在struct
关键字前面才有意义。
synth
是对象(变量)的名称。它不需要,实际上不能是struct
关键字。
如果您愿意,可以添加typedef
,为类型struct demo
添加第二个名称。 (typedef
没有定义新类型;它只是为现有类型定义新名称,别名。)例如,常见的习语是:
typedef struct demo {
/* ... */
} demo;
与原始声明一样,这实际上是两个声明,struct
定义创建类型struct demo
,typedef
创建新名称demo
类型。它可以写成:
struct demo {
/* ... */
};
typedef struct demo demo;
如果您愿意,可以通过对象声明:
demo synth;
(请注意,不需要将struct标签和typedef名称区分开来,恕我直言,它们更清晰,因为它们是相同的。)
是否对结构类型使用typedef
的选择主要是样式之一。我个人的偏好是不使用typedef
作为结构; struct demo
已经有了一个非常好的名字。但是很多程序员喜欢使用一个单一标识符的名称。
答案 2 :(得分:0)
这与您声明的相同:
int i;
这样做了:
printf("Size of int: %i\n", sizeof(int));
printf("Size of int: %i\n", sizeof(i));
这两行会打印相同的值。
如果你有这个:
typedef struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
} mydemo;
mydemo synth;
你可以这样做:
printf("Size of struct: %i\n", sizeof(struct demo));
printf("Size of struct: %i\n", sizeof(mydemo));
printf("Size of struct: %i\n", sizeof(synth));
他们也会打印同样的东西。
答案 3 :(得分:0)
不,这不是你的想法。这不是因为我可以通过
struct data structure
变量名访问synth
;但是,在我看到的示例中,为了使我能够执行此操作,struct
需要以typedef
开头。
typedef
您可以使用synth
访问结构成员。
在此示例中,未使用
typedef
,但我仍然可以通过synth
引用此结构。
由于synth
本身,因为它是struct variable
,您可以访问struct的成员。
typedef
是C语言中使用的关键字,用于为现有类型指定备用名称。大多数用于用户定义的数据类型。
一个例子 -
typedef struct A{
char B;
int C;
}D ;
现在,D
可用于声明struct变量。
没有typedef
-
struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
}synth;
synth
是一个struct变量,您可以访问struct的成员。但是在没有typedef
的情况下,如果你想声明struct变量,你必须像这样声明 -
struct demo t;
在任何一种情况下,如果您删除typedef
,那么您也可以使用synth
访问结构, typedef
在此中没有任何作用。
答案 4 :(得分:0)
typedef关键字: 有一种更简单的方法来定义结构,或者您可以“创建”别名类型。例如:
typedef struct
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
现在,您可以直接使用Books来定义Books类型的变量,而无需使用struct关键字。以下是示例:
Books Book1, Book2;
您可以对非结构使用typedef关键字,如下所示:
typedef long int *pint32;
pint32 x, y, z;
x,y和z都是指向长整数的指针