为了账号安全,请及时绑定邮箱和手机立即绑定

结构与结构定义

结构与结构定义

C C++
FFIVE 2019-06-03 14:58:57
结构与结构定义我是C编程的初学者,但我想知道使用typedef定义结构与不使用typedef..在我看来,这真的没有什么区别,他们实现了同样的目标。struct myStruct{     int one;     int two;};v.V.typedef struct{     int one;     int two;}myStruct;
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

常用的成语是同时使用:

typedef struct X { 
    int x; } X;

它们是不同的定义。为了使讨论更清楚些,我将分两句:

struct S { 
    int x; };typedef struct S S;

在第一行中,定义了标识符。S在struct名称空间内(不是C+意义上的)。您可以使用它并定义新定义类型的变量或函数参数,方法是将参数的类型定义为struct S:

void f( struct S argument ); // struct is required here

第二行添加类型别名。S在全局名称空间中,从而允许您只编写:

void f( S argument ); // struct keyword no longer needed

注意,由于这两个标识符名称空间是不同的,所以定义S在结构和全局空间中都不是错误,因为它不是重新定义相同的标识符,而是在不同的位置创建不同的标识符。

为了使差别更清楚:

typedef struct S { 
    int x; } T;void S() { } // correct//void T() {} // error: symbol T already defined as an alias to 'struct S'

可以使用相同的结构名称定义一个函数,因为标识符保存在不同的空格中,但不能定义与typedef当这些标识符碰撞时。

在C+中,由于定位符号的规则发生了微妙的变化,因此略有不同。C+仍然保留两个不同的标识符空间,但与C中不同的是,当您只在类标识符空间中定义符号时,不需要提供struct/class关键字:

 // C++struct S { 
    int x; }; // S defined as a classvoid f( S a ); // correct: struct is optional

哪些更改是搜索规则,而不是定义标识符的位置。编译器将搜索全局标识符表和之后。S还没有找到它会搜索的S在类标识符中。

前面提出的代码的行为方式相同:

typedef struct S { 
    int x; } T;void S() {} // correct [*]//void T() {} // error: symbol T already defined as an alias to 'struct S'

的定义之后,S函数的第二行中,编译器不能自动解析结构S,要创建对象或定义该类型的参数,必须返回到包含struct关键词:

// previous code here...int main() {
    S(); 
    struct S s;}


查看完整回答
反对 回复 2019-06-03
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

structtypedef是两件完全不同的事。

这个struct关键字用于定义或引用结构类型。例如:

struct foo {
    int n;};

创建一个名为struct foo..名字foo标签;只有在紧接struct关键字,因为标记和其他标识符是不同的。名称空间..(这类似于C+的概念,但比C+的概念限制得多。)namespace(S.)

typedef尽管有名称,但不定义新类型;它只是为现有类型创建一个新名称。例如,鉴于:

typedef int my_int;

my_int的新名称intmy_intint一点儿没错同样的类型。类似地,考虑到struct以上定义,您可以写:

typedef struct foo foo;

类型已经有了名字,struct foo..这个typedef声明为同一类型提供了一个新名称,foo.

语法允许您将structtypedef变成一份声明:

typedef struct bar {
    int n;} bar;

这是一个常见的成语。现在,您可以将这种结构类型称为struct bar或者就像bar.

请注意,直到声明的末尾才能看到ty胡枝子的名称。如果结构包含指向自身的指针,则必须使用struct供参考的版本:

typedef struct node {
    int data;
    struct node *next; /* can't use just "node *next" here */} node;

一些程序员将使用不同的标识符来表示struct标记和ty胡枝子名称。在我看来,这是没有好的理由的;使用相同的名字是完全合法的,并使他们更清楚地知道他们是相同的类型。如果必须使用不同的标识符,至少要使用一致的约定:

typedef struct node_s {
    /* ... */} node;

(就我个人而言,我宁愿省略typedef并将类型称为struct bar..这个typedef节省一些输入,但它隐藏了一个事实,即它是一种结构类型。如果您希望该类型是不透明的,这可能是一件好事。如果客户端代码将引用成员n从名字上讲,它并不是不透明的;它显然是一个结构,在我看来,把它称为一个结构是有意义的。但是很多聪明的程序员在这一点上不同意我的观点。要做好阅读和理解任何一种方式编写的代码的准备。)

(C+有不同的规则。作出声明struct blah,您可以将该类型称为blah,即使没有类型的胡枝子。如果你认为这是件好事的话,使用类型胡枝子可能会让你的C代码更像C+。)


查看完整回答
反对 回复 2019-06-03
  • 3 回答
  • 0 关注
  • 566 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信