警告:通过在ARMCC中使用C宏来“额外;忽略”

时间:2013-09-04 10:25:02

标签: c armcc

在这种情况下,我的编译器会发出警告#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风格。

3 个答案:

答案 0 :(得分:4)

有点像kludge,但它似乎适用于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一样)。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

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