我得到了以下我正在分析的代码,我不太确定函数中的typedef结构和结构。 在全局中,以下代码是:
typedef struct
{
float width, height, start;
unsigned int *pixmap;
}arguments;
但是当我在下面的同一个程序中查看一个函数时,我可以找到:
struct arguments{
float start;
float width;
float height;
unsigned int *pixmap;
};
我的问题是,在函数中添加此struct arguments
是否有必要,因为我已经在全局声明了它?
答案 0 :(得分:3)
不一定。由于结构是在全局范围内声明的,因此您仍然可以使用它。请记住typedef struct
和struct
之间的差异,您可以在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
类型的别名。