gpt4 book ai didi

c - 函数结构 - 差异

转载 作者:行者123 更新时间:2023-11-30 16:30:18 33 4
gpt4 key购买 nike

将结构传递给函数的正确方法是什么?两种解决方案都可以正常工作,但是有什么显着差异吗?

 struct sensor
{
int32_t temperature;

}BME280;

int32_t read_temperature(struct sensor *BME)
{
}

对比

 typedef struct sensor
{
int32_t temperature;

}BME2801;

int32_t read_temperature(BME2801 *BME)
{
}

int main(void)
{
BME2801 BME280;
}

最佳答案

在第一个示例中,您定义了一个 structsensor 类型的结构,并声明了一个名为 BME280 的相同类型的全局变量。您的read_tempere函数正在获取一个指向structsensor的指针。您的变量 BME280 没有用于任何用途。

在第二个示例中,您定义了 structsensor 类型的结构,并使用 typedef 创建新的类型名称 (BME2801 ),这将允许您在代码中键入 BME2801 而不是 structsensor。在您的 main 函数中,您声明一个名为 BME280BME2801(又名 structsensor)类型变量。您的 read_Temperature 函数的工作原理与以前相同。

这是两个不同的示例,绝对不等同。

使用指针通过引用传递结构是很好的。通常,您希望使用指针传递所有结构,特别是当它是特别大的struct时。只需从第一个示例中删除 BME280 即可。

现在的问题是是否使用typedef创建一个新的类型名称来引用structsensor。如果它可以提高易读性和清晰度,请务必这样做。假设您想将每个structsensor引用为BME2801,您的第二个示例可以正确执行。我认为,structsensorBME2801 明显更清晰。通常,您可以通过两种方式之一定义您的结构并这样使用它:

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

或者您可以使用typedef。这通常是通过结构来完成的,以消除使用关键字 struct 的要求。 C++ 自动执行此操作,无需显式 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 一个 struct 来简单地省略 struct 关键字是一个风格问题。 The Linux kernel coding style建议几乎不要对结构使用 typedef ,除非您主动隐藏其内容并鼓励使用您的 struct 的开发人员使用您提供的特殊访问器函数。我在自己的代码中遵循了这个建议,但还有其他意见。

关于c - 函数结构 - 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51312499/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com