C 如何将volatile float变量分配给任何其他变量?

C 如何将volatile float变量分配给任何其他变量?,c,embedded,C,Embedded,我在file1.h中声明了一个volatile float变量: volatile float DC_VOLT; //AN03 我想在另一个文件中使用它,比如file2.c将其分配给file2.c的全局变量: volatile float GEN_VOLT = DC_VOLT; 但是显示了一个编译器错误 错误:-初始值设定项元素不是常量 另一件有趣的事情发生了:当我用函数的局部变量执行赋值时,它起作用了 void CMP_PLL(void) { vol

我在
file1.h
中声明了一个volatile float变量:

volatile float DC_VOLT;                 //AN03
我想在另一个文件中使用它,比如
file2.c
将其分配给file2.c的全局变量:

volatile float GEN_VOLT = DC_VOLT;
但是显示了一个编译器错误

错误:-初始值设定项元素不是常量

另一件有趣的事情发生了:当我用函数的局部变量执行赋值时,它起作用了

void CMP_PLL(void)
{
    volatile float GEN_VOLT =DC_VOLT;                      //Here it works
    if(GEN_VOLT>(float)PLL_Range)                         
    {
        if(PLL_VOLT<Vref_PLL)
        {
            CMP_Synch();
            SYNCH_Flag =1 ;
        }
        else
        {
            CMP_Asynch();
            SYNCH_Flag = 0;
        }
    }
    else
    {
        CMP_Asynch();
        SYNCH_Flag = 0;
    }
}
void CMP\u PLL(void)
{
易挥发浮子GEN\u VOLT=DC\u VOLT;//在这里工作
中频(发电机电压>(浮动)锁相环范围)
{

如果(PLL_VOLT为了初始化全局变量,需要赋值的r_值为常数。从:

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字

基本上,编译器需要一个常量值来初始化全局变量,我们将它放在对象文件的末尾。
请注意,子说明的子句如何不包含局部变量,这就是为什么在第二个示例中事情会起作用。当调用
CMP\u PLL()
函数时,
GEN\u VOLT
变量被放置在堆栈中,并用调用函数时
DC\u VOLT
的值初始化


如果在您的应用程序中有意义的话,您可以做的是定义一个用于bot变量的公共初始值:

// In file1.h
#define DC_VOLT_INIT 3.3

volatile float DC_VOLT = DC_VOLT_INIT;


// In file2.h
volatile float GEN_VOLT = DC_VOLT_INIT;

否则,您可以直接将
GEN\u VOLT
链接到
DC\u VOLT
使其成为指针。

要初始化全局变量,必须使用编译时常量。当
GEN\u VOLT
初始化时,
DC\u VOLT
的值将为零(因为它是一个全局变量)。欢迎使用SO。您正在混合赋值和初始化变量。初始化值在生成时必须是常量。另一个变量不符合此条件。@Gerhardh是的,我想表达您的意思。但我不擅长英语…,所以我不知道如何表达。@guapi在这种情况下,最好只使用e C标准。@Gerhardh我知道了。谢谢。