运行时值如何成为常量?

How can a runtime value be a const?

来自 FreeRTOS include/StackMacros.h 文件:

#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )

#define taskCHECK_FOR_STACK_OVERFLOW()                                                              \
{                                                                                                   \
    const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack;                         \
    const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5;                                          \
                                                                                                    \
    if( ( pulStack[ 0 ] != ulCheckValue ) ||                                                \
        ( pulStack[ 1 ] != ulCheckValue ) ||                                                \
        ( pulStack[ 2 ] != ulCheckValue ) ||                                                \
        ( pulStack[ 3 ] != ulCheckValue ) )                                             \
    {                                                                                               \
        vApplicationWhosebugHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName );   \
    }                                                                                               \
}

#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */

如果我理解正确,pxCurrentTCB 是 运行 进程的内核结构,pxStack 指向该进程的堆栈开始。每次都不同,但是,它可以以某种方式存储在 const 值中?

关键字 const 可以表示两件事:

  1. 如果 const 变量是用编译时常量初始化的,它本身就是编译时常量。

  2. 如果它在 运行 时间初始化,那么它是一个 运行 时间常数,这意味着一旦初始化它就不能更改其值。

使用 const 也是对代码读者的一个很好的提示,但也可以作为对编译器的提示,编译器可能会进行一些原本不可能进行的优化。

pulStack的定义中:

  1. 第一个 constpulStack 可能 不会 修改它指向的内容。 (即)pulStack[0] = ... 是一个错误
  2. 第二个 const 表示 pulStack 中的值(即它指向的内容)可能 在它所在的块范围内被修改被宣布。 (即)[后续] pulStack = ... 是一个错误