将struct传递给函数的正确方法是什么? 两种解决方案都可以正常工作,但是有什么显着区别吗?
struct sensor
{
int32_t temperature;
}BME280;
int32_t read_temperature(struct sensor *BME)
{
}
vs
typedef struct sensor
{
int32_t temperature;
}BME2801;
int32_t read_temperature(BME2801 *BME)
{
}
int main(void)
{
BME2801 BME280;
}
答案 0 :(得分:0)
在第一个示例中,您要定义类型struct sensor
的结构,并声明一个相同类型的名为BME280
的全局变量。您的read_temperature
函数正在使用指向struct sensor
的指针。您的变量BME280
未用于任何操作。
在第二个示例中,您将定义类型struct sensor
的结构,并使用typedef
创建一个新的类型名称(BME2801
),该名称将允许您键入{{ 1}},而不是代码中的BME2801
。在struct sensor
函数中,您将声明一个名称为main
的{{1}}(又名BME2801
)类型的变量。您的struct sensor
函数与以前一样工作。
这是两个不同的示例,绝对不是等效的。
您可以使用指针通过引用传递结构。通常,您希望使用指针传递所有结构,尤其是在BME280
特别大的情况下。只需从您的第一个示例中切出read_temperature
即可,您很聪明。
现在出现了一个问题,即是否使用struct
来创建一个引用BME280
的新类型名称。如果它提高了清晰度和清晰度,则一定要这样做。假设您想将每个typedef
称为struct sensor
,那么您的第二个示例正确地做到了。我认为struct sensor
比BME2801
更清晰。通常,您可以通过以下两种方法之一来定义结构,并以此来使用它:
struct sensor
或者您可以使用BME2801
。通常使用结构来完成此操作,以消除使用关键字struct sensor
{
int32_t temperature;
};
int32_t read_temperature (struct sensor *BME)
{
}
int main (void)
{
struct sensor BME280;
/* Initialize your struct with appropriate values here */
read_temperature (&BME280);
}
的要求。 C ++会自动执行此操作,而无需显式的typedef
。
struct
是否typedef
和typedef struct sensor
{
int32_t temperature;
}sensor;
/* 'sensor' now refers to the type 'struct sensor' */
int32_t read_temperature (sensor *BME)
{
}
int main (void)
{
sensor BME280;
/* Initialize your struct with appropriate values here */
read_temperature (&BME280);
}
只是简单地省略了typedef
关键字是一个风格问题。 The Linux kernel coding style建议几乎不要将struct
用于结构,除非您主动隐藏其内容并鼓励使用struct
的开发人员使用您提供的特殊访问器功能。我在自己的代码中遵循了此建议,但是还有其他意见。