4

#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 风格。

4

3 回答 3

4

一种有点杂乱无章但似乎适用于 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根本没有定义的大小)。

于 2013-09-04T10:27:44.880 回答
3

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

#if defined(SYSTEM_A)
  #define SOME_MACRO(x) u16_t x##something
#else
  #define SOME_MACRO(x)    unsigned :0
#endif
于 2013-09-04T11:01:40.507 回答
3

您还可以插入一个空的匿名结构:

#if defined(SYSTEM_A)
  #define SOME_MACRO(x) u16_t x##something
#else
  #define SOME_MACRO(x)    struct {}
#endif
于 2013-09-04T10:57:41.177 回答