为什么可以用内联汇编代码的结果初始化全局变量?

时间:2018-12-28 23:58:55

标签: c++ inline-assembly

考虑此代码,该代码将在PIC32上编译(来源:openscope-mz)

static  uint32_t    tSLoop              = ReadCoreTimer();

static inline uint32_t ReadCoreTimer(void)
{
    uint32_t coreTimerCount;
    __asm__ __volatile__("mfc0 %0,$9" : "=r" (coreTimerCount));
    return(coreTimerCount);
}

请解释为什么这是有效的C代码。

2 个答案:

答案 0 :(得分:2)

否,这是无效的C代码,没有实现定义的扩展。静态变量的初始化必须是一个常量表达式。 specified是一个常量表达式-函数的结果不在该列表中。 C标准允许实现接受其他形式的常量表达式,因此,通过实现定义的扩展来接受此类语句,它可以是有效的C代码。无论如何,我怀疑这里不是这种情况。

static  uint32_t    tSLoop              = ReadCoreTimer();

来自C ++文件LoopStats.cpp

答案 1 :(得分:1)

这是有效的代码,因为它是C ++,而不是C。正如Kamil Cuk所指出的那样,该代码似乎来自a C++ file项目中的openscope-mz。 C ++允许这种类型的初始化程序,而C除了作为实现相关的扩展之外,其他都不允许。