2013-05-13 100 views
0

像往常一样,Wikipedia's article on structs不明确。它提供了,因为这对于结构的语法:澄清C结构语法

[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?

感谢

+1

请参见[this](http://stackoverflow.com/questions/4698600/whats-the-syntactically-proper-way-to-declare-a-c-struct)。 – 2013-05-13 12:19:56

+1

flashback heh:http:// stackoverflow。com/questions/16415734/using-typedef-with-an-instance-declaration-wiki-error – 2013-05-13 12:27:36

+0

非常好,谢谢你,虽然它没有回答我所有的问题,但总是有很好的解释 – Jodes 2013-05-13 12:28:48

回答

3

•What would the typedef keyword do here?

这将允许你创建你的结构法的类型定义,就像任何其他类型。这使您不必每次输入struct xxx struct_name。你不需要这个,因此[]

•What does the [struct_name] mean? (Is it the name you're giving to the new struct data type?)

是的,如果你选择了。你也可以创建一个无名结构,所以你不需要给它命名。

•What does the [struct_name_t] mean?

这就是typedef定义的名称,如果你选择的typedef的结构

•what does the [struct_instance] mean? (Is it creating a single instance of the struct?)

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

•I presume [struct struct_name *struct_instance;] creates a pointer in the struct which would point to a second instance of the struct). Correct?

对,这对于链接中的“下一个”类型指针是有用的名单。

结构例如:

typedef struct foo{ 
    int count; 
    struct foo *next; 
} foo_t myfoo; 

是其填充在一个例子;这允许你声明一个新的结构体:

foo_t new_foo_struct; 

由于typedef和typedef'd名称。如果忽略那些像这样:

struct foo{ 
    int count; 
    struct foo *next; 
} myfoo; 

现在你不得不使用struct关键字为每个实例,如:

struct foo new_foo_struct; 

打破它在超过1文件:

/*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"); 
+0

非常好,谢谢。然而,我的问题仍然是,我将如何在.h文件中声明它,然后在.c文件中指定它?类型和实例 – Jodes 2013-05-13 12:27:12

1
sub.h 
------ 
typedef struct{ 
char name[20]; 
char artist[10]; 
}song; 


sub.c 
---- 
song mysong={"Me Singing","Me"}; 
0
typedef struct struct_name 
{ 
    char name[20]; 
    char artist[10]; 
}struct_name_t structInstance; 

的typedef - 这意味着你正在创建一个新的类型(struct_name_t

所以,在C代码,你可以创建这样一个实例:

struct_name_t myVariable; 

或你可以明确写出:

struct struct_name myVariable; 

structInstance最后意味着您想在您定义它的同一时刻创建结构实例(并且该变量的名称是structInstance)。这不是你会一直使用的东西,但它在某些情况下很有用。

如果你想创建结构的实例,并指定/在创建时初始化的成员,你可以做这样的:

struct_name_t myVariable = { "Foo", "bar" }; 

“名称”成员将包含“富”和艺术家成员将包含“酒吧”。

注: 如果你这样写:

struct_name_t myVariable = { 0 }; 

,将填补你用零整个结构!

2

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

struct tagname { 
    ... fields ... 
}; 

宣称这只是它,只有那tagname部分是在某些情况下是可选的。

此外,您可以

  • 声明为struct类型的别名通过typedef
  • 或“一气呵成”的struct

的变量,但我不认为这是很好的风格,应该分开。