我正在开发一些多设备程序,并且需要一个宏来帮助检测变量的变化。我想使用此宏来检测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 : '{
取决于编译器。
答案 0 :(得分:5)
因为typeof
不是标准C,而是gcc扩展名。您可以尝试使用标准_Generic
重写它。
此外,以双下划线__
开头的标识符保留给标准库实现,不应在其他代码中使用。