为什么此宏编译器依赖于?

时间:2019-10-03 10:35:57

标签: c gcc integrity

我正在开发一些多设备程序,并且需要一个宏来帮助检测变量的变化。我想使用此宏来检测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 : '{

取决于编译器。

1 个答案:

答案 0 :(得分:5)

因为typeof不是标准C,而是gcc扩展名。您可以尝试使用标准_Generic重写它。

此外,以双下划线__开头的标识符保留给标准库实现,不应在其他代码中使用。

相关问题