struct关键字使用错误

时间:2010-10-11 14:32:09

标签: c

typedef struct error{int warning, error, exception;}error;

main()
{
    error g1;
    g1.error =1;
    printf("%d",g1.error);
}

以下是其输出为1的代码示例。

但我需要解释一下这段代码是如何工作的?

4 个答案:

答案 0 :(得分:2)

让我们从洋葱的内部开始:

struct error
{
    int warning, error, exception;
};

它定义了一个名为error的结构,包含3个元素:warningerrorexception

要使用它,您可以使用error g1;替换main函数中的struct error g1;行。然后将该结构定义包装在typedef中,这实际上告诉编译器,类型error等同于struct error。名称都在独立的空间中:类型,结构和该结构中的元素。所以他们不会发生冲突。也就是说,编写

有点干净
typedef struct
{
    int warning, error, exception;
} error;

因为它没有给出struct 2的名字。我给的第一个版本也是有效的;有些人更喜欢明确他们对结构的使用。

答案 1 :(得分:2)

这段代码中你不明白的是什么? error不是C中的保留字,因此您可以将其用作(变量/结构)名称。

您定义了包含3个struct字段的int,将其实例化为本地变量g1,将其分配给其中一个字段,然后在标准输出上打印该字段。如果您有任何更具体的问题,请澄清。

答案 2 :(得分:1)

您定义了一个名为error的{​​{1}}成员的结构int。您为error定义了一个名为struct error的typedef(换句话说,别名)。然后,您使用typedef名称创建了error的实例,名为struct error。然后,您将值g1分配给1实例error的{​​{1}}成员。最后,您打印了error

的值

struct name和typedef名称占用不同的名称空间 - 它们可以是相同的。在C中,必须将关键字g1放在结构名称之前:

g1.error

但不是在typedef名称之前:

struct

您还可以输入dede联合和枚举。您可以将结构定义与typedef定义结合使用:

struct S{ /*...*/ };

struct S instance1;

您可以省略结构名称:

struct S{ /*...*/ };
typedef struct S S;

S instance2;

在这种情况下,结构类型只能通过typedef引用。

答案 3 :(得分:1)

这是c中typedef结构的一个非常基本的用法。我建议您访问the wikipedia page on structs进行总体概述,但简而言之:

第一行创建一个新结构类型struct error,其中包含3个整数:warningerrorexception。 typedef充当别名,将struct error重命名为error,因此您只需使用短名称即可引用此类型的项目。

main中的代码然后在堆栈上创建一个新的error,将其error属性设置为1,然后将其打印出来。