C中函数中typedef结构和结构之间的区别

Difference between typedef struct and struct in a function in C

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
typedef struct
{
    float width, height, start;
    unsigned int *pixmap;
}arguments;

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

1
2
3
4
5
6
  struct arguments{
    float start;
    float width;
    float height;
    unsigned int *pixmap;
  };

我的问题是,是否有必要在函数中添加这个struct arguments,因为我已经在全局中声明了它?


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


由于标准定义了术语,所以您所提供声明的数据类型不是"兼容类型",因此它们不能互换使用。要使结构类型兼容,它们不仅必须具有相同的成员名称和类型,而且必须具有相同的标记。在最后一点上,这两个观点不同。

尤其是,您的typedef将标识符arguments定义为具有指定成员的无标记结构类型的别名。如果该标识符在作用域中,则可以将其用作类型名。实际上,因为它引用的结构类型没有标记,所以没有其他方法引用该类型。

另一个声明声明声明了一个带有标记arguments的结构类型。在该声明范围内,可以将该类型称为EDCOX1(5),但不只是EDCOX1(3)(C++在这点上有所不同):

1
2
3
4
struct arguments my_arguments;

my_arguments.width = 5;
// ...

My question is, is it necassary to add this struct arguments in the function since i already declared it in global?

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

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

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

…或者两个…

1
2
3
4
5
6
7
struct arguments
{
    float width, height, start;
    unsigned int *pixmap;
};

typedef struct arguments arguments;

任何一种选择都使arguments成为struct arguments类型的别名。