【问题标题】:Difference between typedef struct and struct in a function in C [duplicate]C中函数中typedef struct和struct之间的区别[重复]
【发布时间】:2017-05-13 05:08:16
【问题描述】:

我得到了我正在分析的以下代码,我不太确定 typedef 结构和函数中的结构。 在全局中,以下代码是:

typedef struct
{
    float width, height, start;
    unsigned int *pixmap;
}arguments;

但是当我查看下面同一个程序中的一个函数时,我会发现:

  struct arguments{
    float start;
    float width;
    float height;
    unsigned int *pixmap;
  };

我的问题是,既然我已经在全局中声明了它,是否需要在函数中添加这个struct arguments

【问题讨论】:

  • 你可以使用其中任何一个,只要你知道成员的顺序是不同的。
  • “当我查看同一个程序中的函数时”。你是什​​么意思?我猜struct 没有在函数内部定义(可能是,但我猜这不是你的意思)。您可能是指与使用它的函数在同一个文件中。如果是这样,那么答案是“视情况而定”。这取决于typedef 的定义位置以及函数是否可以看到它。我们没有您的完整代码上下文,无法判断是否是这种情况。

标签: c struct typedef difference


【解决方案1】:

不一定。由于该结构是在全局范围内声明的,因此您仍然可以使用它。请记住typedef structstruct 之间的区别,您可以在here 上阅读并知道全局结构中成员的顺序与函数结构中成员的顺序不同,即也很重要。

【讨论】:

  • 谢谢!我会确保我完全理解这些差异!
  • @HaniMasta 成员的顺序很重要。
  • 结构标签的有无也很重要。
【解决方案2】:

您提供的声明不是标准定义的“兼容类型”的数据类型,因此它们不能互换使用。为了使结构类型兼容,它们不仅必须具有相同的成员名称和相同顺序的类型,而且还必须具有相同的 tag。两者的区别就在最后一点。

特别是,您的typedef 将标识符arguments 定义为具有指定成员的无标签 结构类型的别名。如果该标识符在范围内,您可以将其用作类型名称。事实上,因为它所引用的结构类型没有标签,所以没有其他方法可以引用该类型。

另一个声明用 tag arguments 声明了一个结构类型。如果该声明在范围内,您可以将该类型称为struct arguments,但不能仅称为arguments(C++ 在这一点上有所不同):

struct arguments my_arguments;

my_arguments.width = 5;
// ...

我的问题是,既然我已经在全局中声明了这个结构参数,是否有必要在函数中添加它?

C 没有全局声明。它具有文件范围声明,默认情况下这些声明具有外部链接的函数和对象,这意味着可以从程序中的任何位置访问它们。那不完全一样。因此,无论您在何处使用这些类型中的任何一种,它的声明都必须在范围内。通常将共享声明放在头文件中以便于满足这些要求。在任何情况下,其中一种类型的声明都不能用作另一种类型的声明。

但是,您可以考虑通过在一个声明中标记 typedefed 结构来使它们兼容...

typedef struct arguments  // <--- note the tag here
{
    float width, height, start;
    unsigned int *pixmap;
} arguments;

...或两个...

struct arguments
{
    float width, height, start;
    unsigned int *pixmap;
};

typedef struct arguments arguments;

这两种方法都使arguments 成为struct arguments 类型的别名。

【讨论】:

  • 现在更清楚该使用什么,不使用什么以及为什么。感谢您抽出宝贵的时间,先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多