我想知道谁实际调用该函数并初始化const变量?
这是.c文件的全局范围。
static const uint32 *GetTableAddress(void)
{
if(memcmp(buf1, buf2, sizeof(buf1)) == 0)
{
return(&buf1);
}
else
{
return((uint32*)0x12345678);
}
}
const uint32 *tab = GetTableAddress();
答案 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()
之前运行,其作用是设置程序使用的内存区域。这包括运行代码来进行这种初始化。