什么时候发生const变量的初始化?

时间:2018-01-18 10:32:35

标签: c embedded

我想知道谁实际调用该函数并初始化const变量?

这是.c文件的全局范围。

static const uint32 *GetTableAddress(void)
{
    if(memcmp(buf1, buf2, sizeof(buf1)) == 0)
    {
      return(&buf1);
    }
    else
    {
        return((uint32*)0x12345678);
    }
}

const uint32 *tab = GetTableAddress();

3 个答案:

答案 0 :(得分:3)

我假设在你的代码中,const uint32 *tab = GetTableAddress();实际存在于一个函数中,因为在文件级别,数据初始化只能从编译时数据(从不是一个函数)完成。

在那种情况下:

static const uint32 *GetTableAddress(void) { ... }

声明并定义一个返回带有内部链接的const uint32_t *指针的函数(static仅表示函数的内部链接)

const uint32 *tab = GetTableAddress();
如果const uint32_t *在文件级别发生,则

是不正确的初始化;如果在函数内部发生,则自动const uint32_t的简单初始化。在这种情况下,该函数将在对象创建时的运行时调用,即在封闭块的开头。

这里,const只是对编译器的承诺,即程序永远不会尝试更改变量的值。

根据您的评论,初始化发生在文件级别。这在C中是不允许的,但是正确的C ++,其中静态变量可能具有动态初始化。在这种情况下(C ++),文件级静态变量的初始化发生在执行main的第一条指令之前。

答案 1 :(得分:1)

找出正在发生的事情的最好方法是编译它并查看生成的程序集 即使你对装配不那么熟悉,你也要掌握所发生的事情。

我刚刚在Atmel Studio 7的ATmega328P测试项目中用avr-g ++ 5.4尝试了你的代码片段,它产生了一些&#34;功能&#34;名为<_Z41__static_initialization_and_destruction_0ii>,似乎在进入main之前被调用。它最后做的是调用

120:    0e 94 5f 00     call    0xbe    ; 0xbe <_ZL15GetTableAddressv>

这是你的功能。

正如其他人所说,这不是标准的C,而且只是avr-g ++的方式。

答案 2 :(得分:0)

不确定是否已指定,但在许多实现中,有一个函数在main()之前运行,其作用是设置程序使用的内存区域。这包括运行代码来进行这种初始化。