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

c头文件中的静态结构声明和初始化,c,struct,embedded,header-files,microcontroller,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 usciConfi

我开发了一个使用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文件中,我包含了上面的头文件,并在不同的场合使用uscionfigflags,有时在中断中使用

这合法吗

我试图理解为什么在SDK中调用BT_bluetooth_on方法后,结构的值在运行时会发生变化(如果与问题相关)

谢谢,
亚当。

静态的
这里并不是你认为它的意思。这意味着声明和变量只在一个编译单元中可见。也就是说,您有两个独立的
uscionfigflags
实例

如果需要全局变量,则需要使用
extern
而不是
static
,并使用其中一个c文件中的初始值进行实际声明(无
extern


也要厌倦在没有正确锁定的情况下更改结构中的值。只读并发访问通常是可以的。

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

而且
静态
并不意味着恒定。因此,您可以以任何方式修改结构的值

以下是来自

在计算机编程中,静态变量是一个已被修改的变量 静态分配-其生存期在整个 节目。这与更短暂的自动控制形成对比 变量(局部变量),其存储已分配和 在调用堆栈上解除分配;与那些 存储是动态分配的


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

在头文件中定义变量从来都不是一个好主意。即使您需要在两个同名的不同文件中使用两个静态变量,最好还是将.c文件本身放进去,因为它有助于更好的维护性和可读性,因为您将清楚地知道它在哪些文件中实际存在并正在使用

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


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

是的,我倾向于考虑在.h头文件中初始化全局值是个坏主意。