我对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
关键字意味着,该变量(更严格地说,由该变量表示的对象)具有内部链接,您可以认为它或多或少是该模块私有的,在那里定义它。在对象文件中不会为这样的变量生成符号(您可以使用nm
或readelf
等工具检查它)。
您可以通过省略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()。