如何从另一个模块访问静态变量(模块范围中的静态)?在C



我对C编程的模块化结构不是很熟悉,所以我决定向您寻求帮助。假设项目中有两个模块。一个是sx1272.c,另一个是sx1272_ll.c。变量radio_is_on在sx1272_ll.c中声明如下:

static uint8_t volatile radio_is_on;

,然后由sx1272.c中的函数访问,如下所示:

foo(){
   ...............
   if(radio_is_on){
      blablabla...
      ............
   }
   ...............
}

所以如果radio_is_on是静态的(在模块范围内)它是如何被其他模块访问的?

sx1272_ll.c

sx1272.c

我觉得你把

 #include "sx1272_ll.c"

在你的源文件sx1272.c

因此,文件sx1272_ll.c的全部内容只是复制粘贴到sx1272.c中,即您在预处理阶段写入#include "sx1272_ll.c"的位置。

参考此链接:https://en.wikipedia.org/wiki/C_preprocessor#Including_files

不能将变量声明为static并从其他模块访问。

static有3种用法:

1)如果变量在块内声明为静态(例如:函数),它将在调用期间初始化它的值。

int add(void){
        static int var = 0;
        var++;
        return var; 
}
int main(void){
        printf("Var = %d", add());    // Here var = 1 
        printf("Var = %d", add());    // Here var = 2
        return 0;
}

2)如果一个变量在一个文件中声明为static,它只能在这个文件中被访问,其他文件不能访问它。如果我们声明文件X中的static uint8_t volatile radio_is_on;,在文件y中无法访问

如果一个函数在一个文件中声明为static,它只能在这个文件中被访问,其他文件不能访问它。

任何函数外的static关键字意味着,该变量(更严格地说,由该变量表示的对象)具有内部链接,您可以认为它或多或少是该模块私有的,在那里定义它。在对象文件中不会为这样的变量生成符号(您可以使用nmreadelf等工具检查它)。

您可以通过省略static(可选地添加extern关键字)使用外部链接来定义它,或者如果出于某些特殊原因(?)需要它为static,则编写包装器函数,将其暴露给其他模块。它可以定义为:

sx1272_ll.c:

static uint8_t volatile radio_is_on;
uint8_t volatile *get_radio_is_on(void)
{
    return &radio_is_on;
}

然后将prototype放入:

sx1272.c:

uint8_t volatile *get_radio_is_on(void);

没有风险,这样的指针将指向无效的内存区域,因为文件作用域变量具有静态存储持续时间,这意味着整个应用程序的生命周期。

从最严格的意义上说,它不可能从其他模块访问静态变量,这正是关键字的目的。

但是一种方法是添加一个返回其值的外部函数is_radio_on()。

最新更新