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

时间:2016-12-28 21:43:25

标签: c struct typedef difference

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

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

但是当我在下面的同一个程序中查看一个函数时,我可以找到:

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

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

struct arguments my_arguments;

my_arguments.width = 5;
// ...
  

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

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类型的别名。