【问题标题】:Why is this macro compiler dependent?为什么这个宏编译器依赖?
【发布时间】:2019-10-05 23:19:36
【问题描述】:

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

取决于编译器。

【问题讨论】:

  • 你遇到了什么错误?
  • 我将它们添加到描述中

标签: c gcc integrity


【解决方案1】:

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

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

【讨论】:

  • OP:只要 Visual Studio 不支持 C11 功能(如 _Generic),这可能会有所帮助:stackoverflow.com/a/51960928/1606345
  • @DavidRanieri 你不能 AFAIK 使用 Visual Studio 来编译标准 C,因为它不是一个符合标准的编译器。
  • @Lunidn 这就是为什么我建议将 Intel C 编译器插入 Visual Studio(或切换到 gcc / CLang)
  • 另外,({}) 语法也是 GCC extension
  • @Lundin,感谢您的回答。例如,如果我将 typeof 更改为 int 也没关系。双下划线只是为了澄清内部变量,在真正的宏中我不使用它们。
猜你喜欢
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多