为一个平台共享部分结构,同时为其他平台涂黑

时间:2017-06-01 08:12:51

标签: c++ c structure cross-platform bit

我正在开发一段代码,它有一些带有位字段的结构,其中一个成员需要用于一个平台,而黑色则用于其他平台。示例:

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并用这个宏替换位字段,但它抱怨零位字段宽度。

3 个答案:

答案 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违规潜力很高但它可能就像你追求的那样?

https://godbolt.org/g/7d29wT

#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() {

}

这个怎么样?

https://godbolt.org/g/1zJ0s4

#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;
}