无法在 lambda 中使用 asm 函数?

Unable to use asm functions in lambda?

Godbolt 编译器中的以下代码片段 fails to compile

#define cli()  __asm__ __volatile__ ("cli" ::: "memory")

void (*q)() = [](){ cli(); };

第 1 行的错误是 error: expected ')' before '::'

但是如果我将汇编函数包装在一个普通的 C 函数中,它 compiles fine:

#define cli()  __asm__ __volatile__ ("cli" ::: "memory")

void foo() { cli(); }

void (*q)() = [](){ foo(); };

怎么会这样?

这是一个使用 Arduino 框架代码的最小示例,cli() 定义来自框架本身。所以我不能改变它。

这是一个编译器错误。基于 gcc 7 或更早版本的编译器存在此错误。它已在 gcc 8 中修复。

(如果去掉::: "memory"部分,用gcc 7编译成功。但是生成的汇编是错误的,cli放在了lambda之外,godbolt)