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定義されていない場合、警告は正しいです。単純;に、構造体の中に 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 に答える