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