avr-libc (void)__s 在一个宏的结尾

avr-libc (void)__s at the end of a macro

我目前正在尝试弄清楚 avr-libc 的 /util/atomic.h 是如何发挥其魔力的。到目前为止,我了解了使用 __cleanup__ 属性来实现 RIAA。我还理解了巧妙地使用 for 循环来创建 "block parameter"。我不明白的是以下函数末尾的 (void)__s; 行。

static __inline__ void __iSeiParam(const uint8_t *__s)
{
    sei();
    __asm__ volatile ("" ::: "memory");
    (void)__s;
}

static __inline__ void __iCliParam(const uint8_t *__s)
{
    cli();
    __asm__ volatile ("" ::: "memory");
    (void)__s;
}

这些函数的最后一行是做什么用的?

这些函数不使用它们的参数,所以使用参数是为了消除 "unused parameter" 编译器警告。

包括对 (void) 的转换,因为如果没有它,大多数编译器会发出另一个警告,类似于 "expression result unused"(如果我没记错的话,在 GCC 的情况下)。