c头文件中的静态结构声明和初始化

时间:2012-09-24 01:23:38

标签: c struct embedded header-files microcontroller

我开发了一个使用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方法之后理解为什么(以及它与问题有关)结构的值在运行时更改。

谢谢, 亚当。

3 个答案:

答案 0 :(得分:8)

static这并不意味着你的意思。这意味着声明和变量只能在一个编译单元中可见。也就是说,您有两个独立的usciConfigFlags实例。

如果你想要一个全局变量,你需要使用extern而不是static并使用你的一个c文件中的初始值进行实际声明(没有extern)。 / p>

还要在没有正确锁定的情况下更改结构中的值。只读并发访问通常很好。

答案 1 :(得分:1)

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

同样static并不意味着不变。因此,您可以以任何方式修改结构的值。

以下内容来自wikipedia

  

在计算机编程中,静态变量是一个变量   静态分配 - 其生命周期延伸到整个运行期间   该程序。这与更短暂的自动化相反   变量(局部变量),其存储分配和   在调用堆栈上取消分配;与其对象相反   存储是动态分配的。

答案 2 :(得分:1)

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

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

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

Epsalon提出了其他可以考虑的好处。