C结构语法的澄清

C结构语法的澄清,c,struct,C,Struct,和往常一样,情况并不明朗。它给出了如下结构的语法: [typedef] struct [struct_name] { type attribute; type attribute2; /* ... */ [struct struct_name *struct_instance;] } [struct_name_t] [struct_instance]; typedef关键字在这里做什么 [struct_name]是什么意思?(这是您为新结构数据类型指定的名称吗

和往常一样,情况并不明朗。它给出了如下结构的语法:

[typedef] struct [struct_name]
{
    type attribute;
    type attribute2;
    /* ... */
    [struct struct_name *struct_instance;]
} [struct_name_t] [struct_instance];
  • typedef关键字在这里做什么
  • [struct_name]是什么意思?(这是您为新结构数据类型指定的名称吗?)
  • [struct_name_t]是什么意思
  • [struct_instance]是什么意思?(是否正在创建结构的单个实例?)
  • 我假定
    [struct struct_name*struct_instance;]
    在结构中创建一个指针,该指针将指向该结构的第二个实例)。对吗
我将非常感谢一个例子:假设我有三个文件:main.c、sub.c和sub.h。我想在sub.h中声明一个结构实例,并在sub.c中实例化和使用它。假设我想要一个歌曲类型的结构,其成员为
char name[20]
char artist[10]
,并假设我想制作一个实例,mySong,{“我唱歌”,“我”},这在sub.c和sub.h中会是什么样子


谢谢

•typedef关键字在这里做什么?

它允许您创建结构的typedef,就像其他类型一样。这使您不必每次都键入
struct xxx struct\u name
。您不需要这个,因此
[]

•[struct_name]是什么意思?(这是您为新结构数据类型指定的名称吗?

是的,如果你也选择的话。您还可以创建一个无名结构,这样就不需要给它命名

•结构名称是什么意思?

这是typedef的名称,如果您选择对结构进行typedef

•[struct_instance]是什么意思?(是否正在创建结构的单个实例?

是的,它用于创建一个或多个sturct实例

•我假定[struct struct_name*struct_instance;]在结构中创建一个指针,该指针将指向该结构的第二个实例)。正确吗?

对,这对于链表中的“下一个”类型指针很有用

结构示例:

typedef struct foo{
    int count;
    struct foo *next;
} foo_t myfoo;
是所填写内容的一个示例;这允许您通过以下方式声明新结构:

 foo_t new_foo_struct;
因为typedef和typedef的名称。如果您省略了以下内容:

struct foo{
    int count;
    struct foo *next;
} myfoo;
struct_name_t myVariable;
struct_name_t myVariable = { "Foo", "bar" };
现在,您必须为每个实例使用
struct
关键字,例如:

 struct foo new_foo_struct;

要将其拆分为多个文件,请执行以下操作:

/*sub.h*/
typedef struct{
char name[20];
char artist[10];
}song;
然后在来源中:

/*sub.c*/
#include "sub.h"

/*this needs to go into a function or something...*/
song mysong;
strcpy(mysong.name, "Mesinging");
strcpy(mysong.artist, "Me");

•typedef关键字在这里做什么?

它允许您创建结构的typedef,就像其他类型一样。这使您不必每次都键入
struct xxx struct\u name
。您不需要这个,因此
[]

•[struct_name]是什么意思?(这是您为新结构数据类型指定的名称吗?

是的,如果你也选择的话。您还可以创建一个无名结构,这样就不需要给它命名

•结构名称是什么意思?

这是typedef的名称,如果您选择对结构进行typedef

•[struct_instance]是什么意思?(是否正在创建结构的单个实例?

是的,它用于创建一个或多个sturct实例

•我假定[struct struct_name*struct_instance;]在结构中创建一个指针,该指针将指向该结构的第二个实例)。正确吗?

对,这对于链表中的“下一个”类型指针很有用

结构示例:

typedef struct foo{
    int count;
    struct foo *next;
} foo_t myfoo;
是所填写内容的一个示例;这允许您通过以下方式声明新结构:

 foo_t new_foo_struct;
因为typedef和typedef的名称。如果您省略了以下内容:

struct foo{
    int count;
    struct foo *next;
} myfoo;
struct_name_t myVariable;
struct_name_t myVariable = { "Foo", "bar" };
现在,您必须为每个实例使用
struct
关键字,例如:

 struct foo new_foo_struct;

要将其拆分为多个文件,请执行以下操作:

/*sub.h*/
typedef struct{
char name[20];
char artist[10];
}song;
然后在来源中:

/*sub.c*/
#include "sub.h"

/*this needs to go into a function or something...*/
song mysong;
strcpy(mysong.name, "Mesinging");
strcpy(mysong.artist, "Me");
typedef-这意味着您正在创建一个新类型(
struct\u name\t

因此,在C代码中,您可以创建如下实例:

struct foo{
    int count;
    struct foo *next;
} myfoo;
struct_name_t myVariable;
struct_name_t myVariable = { "Foo", "bar" };
或者您可以显式地编写:

struct struct_name myVariable;
末尾的
structInstance
表示您希望在定义结构的同时创建结构的实例(该变量的名称为structInstance)。它不是你会一直使用的东西,但在某些情况下它是有用的

如果要在创建时创建结构实例并分配/初始化成员,可以按如下方式执行:

struct foo{
    int count;
    struct foo *next;
} myfoo;
struct_name_t myVariable;
struct_name_t myVariable = { "Foo", "bar" };
“名称”成员将包含“Foo”,艺术家成员将包含“bar”

注: 如果你这样写:

struct_name_t myVariable = { 0 };
这将用零填充整个结构

typedef-这意味着您正在创建一个新类型(
struct\u name\t

因此,在C代码中,您可以创建如下实例:

struct foo{
    int count;
    struct foo *next;
} myfoo;
struct_name_t myVariable;
struct_name_t myVariable = { "Foo", "bar" };
或者您可以显式地编写:

struct struct_name myVariable;
末尾的
structInstance
表示您希望在定义结构的同时创建结构的实例(该变量的名称为structInstance)。它不是你会一直使用的东西,但在某些情况下它是有用的

如果要在创建时创建结构实例并分配/初始化成员,可以按如下方式执行:

struct foo{
    int count;
    struct foo *next;
} myfoo;
struct_name_t myVariable;
struct_name_t myVariable = { "Foo", "bar" };
“名称”成员将包含“Foo”,艺术家成员将包含“bar”

注: 如果你这样写:

struct_name_t myVariable = { 0 };

这将用零填充整个结构

那篇文章只是错误地混合了不同的概念,现在纠正了这一点。结构是通过

struct tagname {
  ... fields ...
};
仅此而已,
标记名
部分在某些上下文中是可选的

此外,你可以

  • 通过
    typedef
  • struct
    类型的变量

“一气呵成”,但我不认为这是一种好的风格,应该分开。

那篇文章只是错误地混合了不同的概念,现在纠正了这一点。结构是通过

struct tagname {
  ... fields ...
};
仅此而已,
标记名
部分是optiona