【问题标题】:Static struct declaration and initialization in c header filec头文件中的静态结构声明和初始化
【发布时间】:2012-09-24 01:23:37
【问题描述】:

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

谢谢, 亚当。

【问题讨论】:

    标签: c struct embedded header-files microcontroller


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我倾向于认为在 .h 头文件中初始化全局值是个坏主意。
    【解决方案2】:

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

    另外static 并不意味着恒定。所以你可以用任何你想要的方式修改结构的值。

    以下来自wikipedia

    在计算机编程中,静态变量是经过 静态分配——其生命周期贯穿整个运行 该程序。这与更短暂的自动 变量(局部变量),其存储被分配和 在调用堆栈上释放;并且与那些 存储是动态分配的。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        相关资源
        最近更新 更多