【问题标题】:Warning: "extra ; ignored" by using C macros with ARMCC警告:使用带有 ARMCC 的 C 宏“额外;忽略”
【发布时间】:2013-09-04 10:25:02
【问题描述】:

在这种情况下,我的编译器会发出警告 #381-D: extra ";" ignored

我定义了一个结构,如下所示

struct example_s
{
  u8_t foo;
  SOME_MACRO(bar);
};

SOME_MACRO(x) 执行以下操作:

#if defined(SYSTEM_A)
  #define SOME_MACRO(x) u16_t x##something
#else
  #define SOME_MACRO(x)    /* nothing */
#endif

当然,警告是正确的,当SYSTEM_A 未定义时。仅仅因为我现在在结构中有一个;。但是有人知道正确避免它的方法吗?我不想通过将; 移动到宏中来破坏典型的 C 风格。

【问题讨论】:

    标签: c armcc


    【解决方案1】:

    一种有点杂乱无章但似乎适用于 gcc 的方法:

    #if defined(SYSTEM_A)
      #define SOME_MACRO(x) u16_t x##something
    #else
      #define SOME_MACRO(x) int x[0]   /* nothing */
    #endif
    

    使用这种方法,你最终会得到这样的结构:

    struct example_s
    {
      u8_t foo;
      int bar[0];
    };
    

    具有正确的大小(即与根本没有定义 bar 一样大小)。

    【讨论】:

    • 请注意,这在 ISO C 中无效(数组大小常量“...应具有大于零的值”)。
    • @undur:谢谢——我没有注意到这个问题被标记为 C 并且错误地假设为 C++——但至少在编译为 C 或 C++ 时它似乎确实适用于 gcc。我会把它留给语言律师和学究们在他们认为合适的时候投反对票。 ;-)
    • ARMCC 报错:“数组的大小必须大于零”
    • @daniel:好的-对此感到抱歉-希望其他解决方案之一对您有用。我将把这个答案留在这里,即使它不适用于 ARMCC,以防任何在不同编译器或 C++ 上遇到类似问题的人感兴趣。
    【解决方案2】:

    您可以添加一个未命名的 0 宽度位域:

    #if defined(SYSTEM_A)
      #define SOME_MACRO(x) u16_t x##something
    #else
      #define SOME_MACRO(x)    unsigned :0
    #endif
    

    【讨论】:

      【解决方案3】:

      你也可以插入一个空的匿名结构:

      #if defined(SYSTEM_A)
        #define SOME_MACRO(x) u16_t x##something
      #else
        #define SOME_MACRO(x)    struct {}
      #endif
      

      【讨论】:

      • ARMCC 引发错误“预期声明”。不幸的是,还使用了struct test {}
      猜你喜欢
      • 2019-01-07
      • 1970-01-01
      • 2019-11-04
      • 2023-02-23
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多