功能结构-差异

时间:2018-07-12 18:44:47

标签: c function struct

将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;
}

1 个答案:

答案 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 sensorBME2801更清晰。通常,您可以通过以下两种方法之一来定义结构,并以此来使用它:

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

是否typedeftypedef 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的开发人员使用您提供的特殊访问器功能。我在自己的代码中遵循了此建议,但是还有其他意见。