为什么可以用内联汇编代码的结果初始化全局变量?
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 则不允许,除非作为依赖于实现的扩展。
考虑将在 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 则不允许,除非作为依赖于实现的扩展。