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

Why is it OK to initialize global variable with result from inline assembly code?

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

static  uint32_t    tSLoop              = ReadCoreTimer();

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

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

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

static  uint32_t    tSLoop              = ReadCoreTimer();

来自 LoopStats.cpp 这是一个 C++ 文件。

它是有效代码,因为它是 C++,而不是 C。作为 Kamil Cuk points out, the code appears to come from a C++ file in the openscope-mz 项目。 C++ 允许这种类型的初始化程序,而 C 则不允许,除非作为依赖于实现的扩展。