我正在开发一些多设备程序,我需要一个宏来帮助检测变量的变化。我想使用这个宏来检测 var 中的触发器:
#define TRIG_UP(X) ({ \
static typeof(X) __val_ant=0; \
unsigned char __trig = (X) && !__val_ant; \
__val_ant = (X); \
(__trig );\
})
在如下语句中使用:
if (TRIG_UP(var1))
var2 = TRIG_UP(var3);
使用最后一个 GCC 和 arm-gcc 编译效果很好,但是使用其他编译器(Visual Studio 或 Integrity)我在声明中遇到了一些错误。我的问题是,为什么这个宏依赖于编译器?这取决于C语言的标准吗?如何让它兼容所有情况?
谢谢大家!
我得到的错误是这样的:
error #29: expected an expression
var2 = ({
或
error C2059: syntax error : '{
取决于编译器。
最佳答案
因为 typeof
不是标准 C 而是 gcc 扩展。您可以尝试改用标准 _Generic
重写它。
此外,以双下划线 __
开头的标识符保留用于标准库实现,不应在其他代码中使用。
关于c - 为什么这个宏编译器依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217318/