结构与结构定义

结构与结构定义

我是C编程的初学者,但我想知道使用typedef定义结构与不使用typedef..在我看来,这真的没有什么区别,他们实现了同样的目标。

struct myStruct{
    int one;
    int two;};

v.V.

typedef struct{
    int one;
    int two;}myStruct;


FFIVE
浏览 568回答 3
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;}

紫衣仙女

struct和typedef是两件完全不同的事。这个struct关键字用于定义或引用结构类型。例如:struct foo {     int n;};创建一个名为struct foo..名字foo是标签;只有在紧接struct关键字,因为标记和其他标识符是不同的。名称空间..(这类似于C+的概念,但比C+的概念限制得多。)namespace(S.)A typedef尽管有名称,但不定义新类型;它只是为现有类型创建一个新名称。例如,鉴于:typedef int my_int;my_int的新名称int; my_int和int是一点儿没错同样的类型。类似地,考虑到struct以上定义,您可以写:typedef struct foo foo;类型已经有了名字,struct foo..这个typedef声明为同一类型提供了一个新名称,foo.语法允许您将struct和typedef变成一份声明: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+。)
打开App,查看更多内容
随时随地看视频慕课网APP