【问题标题】:C structs vs typedef struct questionC 结构与 typedef 结构问题
【发布时间】:2011-08-04 05:41:57
【问题描述】:

所以我的问题是多方面的。

为了理解 C(不是 C++),我相信以下代码:

struct Foo { int bar; }; 

创建一个我可以使用的自定义类型,但这样做也是如此:

typedef Foo { int bar; };

我看到的唯一区别是我是否必须在 Foo 类型的变量之前使用“struct”关键字。导致这种行为的差异是什么?

【问题讨论】:

标签: c struct typedef


【解决方案1】:

区别在于:

struct Foo { int bar; }; 

创建名为 Foo 的结构类型 { int bar; }。 IE。完整的类型名称是struct Foo

typedef Foo { int bar; };

为未命名的结构类型{ int bar; }创建别名Foo

但是我不确定您的语法对于严格的 C 语言是否完全正确,但不知何故对于您的编译器来说没问题。或者它创建了一些不同的东西,但它意外地起作用了,C 语法可能非常棘手。无论如何,第二个陈述应该是:

typedef struct { int bar; } Foo;

供进一步参考you can use this

【讨论】:

  • -1,尽管这是一个旧答案,但它仍然不正确。 typedef Foo { int bar; }; 只是无效的 C 语法。
【解决方案2】:

struct 引入了一种新类型,但typedef 只是为另一种类型创建了一个别名。这个声明创建了一个名为struct Foo的新类型:

struct Foo { int bar; }; 

此声明完全无效:

typedef Foo { int bar; };

但是,这个声明是有效的,它创建了一个新的、未命名的类型,并且还为该类型创建了一个别名,称为Foo

typedef struct { int bar; } Foo;

您还可以为命名类型创建别名 - 这将为类型 struct Foo 创建一个别名,称为 Foo

typedef struct Foo Foo;

这两个名称完全可以互换 - 例如,您可以将 struct Foo 传递给声明为采用 Foo 类型参数的函数。

您可以为任何类型创建别名,包括内置类型。例如,您可以为int 创建一个别名Foo

typedef int Foo;

【讨论】:

    【解决方案3】:

    我相信你的语法不正确。 typedef Foo { int bar; }; 应该是 typedef Foo { int bar; } MyFoo;

    人们使用 typedef 的原因是他们可以在声明中删除结构。即:

    struct Foo myFoo;
    //vs.
    MyFoo myFoo;
    

    【讨论】:

      【解决方案4】:

      当我要编译这段代码时

      typedef Foo { int bar; };
      

      它说编译错误

      error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 2014-02-06
        相关资源
        最近更新 更多