我开发了一个使用MindTree蓝牙SDK的嵌入式应用程序。
我在头文件中有以下内容:
typedef struct {
UCHAR outputDir;
UCHAR reset;
UCHAR nack;
UCHAR startCondition;
UCHAR stopCondition;
UCHAR busy;
} USCI_ConfigurationFlags;
static USCI_ConfigurationFlags usciConfigFlags = { UCTR, UCSWRST, UCNACKIFG, UCTXSTT, UCTXSTP, UCBBUSY };
后来在两个.c文件中我包含了上面的标题,并且在不同的场合使用 usciConfigFlags ,有时候在中断中。
这合法吗?
我试图在SDK中调用BT_bluetooth_on方法之后理解为什么(以及它与问题有关)结构的值在运行时更改。
谢谢, 亚当。
答案 0 :(得分:8)
static
这并不意味着你的意思。这意味着声明和变量只能在一个编译单元中可见。也就是说,您有两个独立的usciConfigFlags
实例。
如果你想要一个全局变量,你需要使用extern
而不是static
并使用你的一个c文件中的初始值进行实际声明(没有extern
)。 / p>
还要在没有正确锁定的情况下更改结构中的值。只读并发访问通常很好。
答案 1 :(得分:1)
将标题包含在两个.c
文件中没有问题。 static
修饰符限制文件中变量的可访问范围,仅包括标题。两个不同文件中的两个usciConfigFlags
不相同。
同样static
并不意味着不变。因此,您可以以任何方式修改结构的值。
以下内容来自wikipedia
在计算机编程中,静态变量是一个变量 静态分配 - 其生命周期延伸到整个运行期间 该程序。这与更短暂的自动化相反 变量(局部变量),其存储分配和 在调用堆栈上取消分配;与其对象相反 存储是动态分配的。
答案 2 :(得分:1)
将静态关键字预先添加到变量使其仅在当前翻译单元中可见(即,如果在函数内,仅在该函数内,如果在文件中,则仅在该文件中)。
在头文件中定义变量绝不是一个好主意。即使你需要两个具有相同名称的不同文件中的两个静态变量,最好放入.c文件本身,因为它有助于更好的维护和可读性,因为你将清楚它实际存在的所有文件和正在使用。
如果您将其添加到头文件中,那么稍后,如果某个其他.c文件包含此标头,则该变量将包含在该翻译单元中。
Epsalon提出了其他可以考虑的好处。