嵌入式C利用来自复杂结构的标志

时间:2018-07-11 15:32:10

标签: c embedded structure instance

在源文件inv_mpu.c中,有一个结构定义gyro_state_s和一个文件范围变量声明:

static struct gyro_state_s st = {
    .reg = &reg,
    .hw = &hw,
    .test = &test
};

此结构中嵌套的是成员st.chip_cfg.bypass_mode,我希望从另一个文件访问该成员。

问题:如何在另一个文件中读取此标志st.chip_cfg.bypass_mode的状态?

我尝试过extern struct gyro_State_s st ;,但是当我在if(!st.chip_cfg.bypass_mode)中对其进行测试时,仍然无法识别。

2 个答案:

答案 0 :(得分:-2)

将结构放入两个文件中包含的共享头中。

extern的意思是:“这是在其他地方定义/实例化的”

由于关闭的结构无法编译为任何物理代码(结构的实例可以编译,因此结构本身仅描述了如何创建实例),您只需要在两个文件中定义相同的结构,最好的方法是将结构放在共享的标头中,然后在需要结构的两个文件中包含标头。

答案 1 :(得分:-2)

仅仅为了访问此标志而试图公开st 的所有内容及其定义是一个错误的设计,应避免使用。 Globals are always bad,在这种情况下,您将不必要地使st的所有内部内容对整个程序可见。

inv_mpu.c已经具有一个函数mpu_set_bypass(),该函数在使用前会被调用,因此必须在某个地方有一个原型,很可能在现有的头文件inv_mpu.h中。现有代码样式解决方案最简单,最安全和最合理的做法是添加“ getter ”访问器对应部分mpu_get_bypass()

在inv_mpu.c中,您可以添加:

unsigned char mpu_get_bypass( void )
{
    return st.chip_cfg.bypass_mode ;
}

将原型声明添加到inv_mpu.h中:

unsigned char mpu_get_bypass( void ) ;

然后在访问源文件中,#include "inv_mpu.h",然后调用getter,例如:

if( !mpu_get_bypass() ) ...