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)