2

我开发了一个使用 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 方法后,我试图了解为什么(以及是否与问题相关)结构的值在运行时发生变化。

谢谢,亚当。

4

3 回答 3

8

static这里并不意味着你认为它意味着什么。这意味着声明和变量将仅在一个编译单元中可见。也就是说,您有两个独立的usciConfigFlags.

如果您想要一个全局变量,您需要使用externnot并在您的一个 c 文件中使用初始值static进行实际声明(不带)。extern

还要厌倦在没有适当锁定的情况下更改结构中的值。只读并发访问通常没问题。

于 2012-09-24T01:31:57.530 回答
1

.c将标题包含在两个文件中没有问题。修饰符限制文件中变量的static可访问范围,仅包括标题。两个usciConfigFlags不同文件中的两个不相同。

static不代表恒定。所以你可以用任何你想要的方式修改结构的值。

以下来自维基百科

在计算机编程中,静态变量是静态分配的变量——它的生命周期贯穿程序的整个运行。这与更短暂的自动变量(局部变量)形成对比,后者的存储在调用堆栈上分配和释放;并且与动态分配存储的对象相反。

于 2012-09-24T01:34:29.200 回答
1

为变量添加静态关键字使其仅在当前翻译单元中可见(即,如果在函数中,则仅在该函数中,如果在文件中,则仅在该文件中)。

在头文件中定义变量绝不是一个好主意。即使您需要两个具有相同名称的不同文件中的两个静态变量,最好将 .c 文件本身放入,因为它有助于更​​好的维护和可读性,因为您将清楚它实际存在于哪些文件中,并且正在使用。

如果您将其添加到头文件中,那么稍后,如果某个其他 .c 文件包含此头文件,则该变量将不必要地包含在该翻译单元中。

Epsalon 提出了您可以考虑的其他优点。

于 2012-09-24T01:38:43.780 回答