我正在开发一段代码,它有一些带有位字段的结构,其中一个成员需要用于一个平台,而黑色则用于其他平台。示例:
struct FooBar
{
int iFoo: 1, <----------------- Used only for platform 'X'
iBar: 1, <----------------- Used on platforms 'X' and Y''
unused: 2; <--------------- Would change to 2 or 3 based of platform
};
一个简单直接的解决方案是使用ifdef宏。但它看起来不干净,不是一个好的工程方法。 我希望结构是跨平台的。有没有办法在不使用ifdef内部结构的情况下这样做?
我尝试#define SIZEFOO 0
用于平台X并用这个宏替换位字段,但它抱怨零位字段宽度。
答案 0 :(得分:0)
&#34;我想保留C&#34; - 继续我的评论:然后让我们模仿多态:
struct FooBar
{
// only the variables common to ALL structs
};
struct FooBarX
{
struct FooBar common;
// specific variables here
};
如果使公共FooBar始终是第一个成员,则可以安全地在FooBar*
和FooBarX*
之间进行转换,因为结构的地址和第一个成员的地址始终相同。重要提示:这仅适用于C! C ++在这方面有所不同:在C ++中,这仅适用于standard layout types - 但是,这就是这种情况......
答案 1 :(得分:0)
如果您不想在结构中使用预处理器宏
#define PLATFORM_X
struct FooBar
{
#ifdef PLATFORM_X
int iFoo: 1, <----------------- Used only for platform 'X'
#endif
int iBar: 1, <----------------- Used on platforms 'X' and Y''
int unused: 2; <--------------- Would change to 2 or 3 based of platform
};
您可以使用不同的标头来定义每个平台的特定结构
#define PLATFORM_X
#ifdef PLATFORM_X
#include "platform_x_bitfiled.h"
#endif
其中platform_x_bitfiled.h
将是
struct FooBar
{
int iFoo: 1, <----------------- Used only for platform 'X'
int iBar: 1, <----------------- Used on platforms 'X' and Y''
int unused: 2; <--------------- Would change to 2 or 3 based of platform
};
答案 2 :(得分:-1)
请参阅@ JonathanLeffler的评论,这不起作用,评论被忽略。
这是我得到的最好的,它不是很好tbh并且它的ODR违规潜力很高但它可能就像你追求的那样?
#define PLATFORM_X
#ifdef PLATFORM_X
#define PX_REMOVE //
#define PY_REMOVE
#elif defined(PLATFORM_Y)
#define PX_REMOVE
#define PY_REMOVE //
#endif
struct FooBar
{
int PX_REMOVE iFoo: 1,
PY_REMOVE iBar: 1,
unused: 2;
};
// Type your code here, or load an example.
int main() {
}
这个怎么样?
#define PLATFORM_Y
#ifdef PLATFORM_X
#define PX_REMOVE(value)
#define PY_REMOVE(value) value,
#elif defined(PLATFORM_Y)
#define PX_REMOVE(value) value,
#define PY_REMOVE(value)
#endif
struct FooBar
{
int PX_REMOVE(iFoo: 1)
PY_REMOVE(iBar: 1)
unused: 2;
};
// Type your code here, or load an example.
int main() {
FooBar f;
f.iBar = 1;
}