无法在 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)
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)