C++ 使用位字段转换大型项目以使用更可移植的内容
我正在从事一个大型软件项目,这是一个20多年来拼凑起来的几百万行代码。它是Fortran/C/C++的混合体,目前是针对Solaris的&使用sunstudio构建的,尽管我可以在clang/gcc上编译它 我们正在将项目迁移到Linux/x86环境。我们面临的挑战之一是在整个项目中自由分布数千位字段 目前的想法大致是这样: 1无论是手动触摸还是通过某种重构工具(可能是使用clang制作的),更改所有位字段定义以反转位字段成员的顺序;e、 g:C++ 使用位字段转换大型项目以使用更可移植的内容,c++,c,bit-fields,C++,C,Bit Fields,我正在从事一个大型软件项目,这是一个20多年来拼凑起来的几百万行代码。它是Fortran/C/C++的混合体,目前是针对Solaris的&使用sunstudio构建的,尽管我可以在clang/gcc上编译它 我们正在将项目迁移到Linux/x86环境。我们面临的挑战之一是在整个项目中自由分布数千位字段 目前的想法大致是这样: 1无论是手动触摸还是通过某种重构工具(可能是使用clang制作的),更改所有位字段定义以反转位字段成员的顺序;e、 g: struct SomeStruct { #if
struct SomeStruct {
#if defined( BIG_ENDIAN )
int x1 : size1;
int x2 : size2;
/* ... */
#else
/* ... */
int x2 : size2;
int x1 : size1;
#endif
};
2在发送/接收这些位字段的任何时候,我们都必须修正字节顺序
从表面上看,这似乎是一个可以接受的方法,尽管不完全是便携式的,但我对此非常谨慎:
这是一个容易出错的oops,忘记了修复字节顺序;哦,更新了该结构的Solaris端,但没有更新Linux端
尽管Sun Studio和gcc在迄今为止测试的案例中,在同一平台上进行测试时,似乎以相同的方式打包结构/位字段,但我一点也不惊讶地发现存在角落案例,而且知道这个代码库,我们有使用角落案例的代码。
从历史上看,开发人员可以随心所欲,例如,当我们开始运行静态分析工具时,我们发现许多代码抛弃了const和其他各种缺点。如果这里涉及到/任何/角落案例,一些更可疑的现有代码可能会变得更脆弱。
如果我们已经需要接触那么多的代码来促进这一移动,我的直觉说我们应该投入时间用一些更可移植的东西来代替它们,这些东西可以自己序列化/反序列化,因此位/字节顺序是通过API指定的,而不是语言/编译器细微差别的函数
我的问题是:保留位字段的解决方案合理吗?有没有更好的解决办法?请记住,这很容易涉及30000行或更多的代码我的方法是:
不要弄乱结构定义
查找加载、保存、接收或发送数据的所有位置
此附加项将转换为定义的字节顺序,以方便使用以前目标的字节顺序
对于这种转换,创建依赖于硬件实现的函数,或者更好地使用htonX和ntohX例程将数据转换为网络字节顺序(即afaik BigEndian)
你可以看看;它声称提供了更安全的位域实现。不过,我不知道字节顺序。看起来系统正在以一种特殊的、依赖于平台的方式序列化。我认为,通过实际定义和记录序列化格式,并仅在序列化代码中处理字节顺序转换,未来的可维护性将大大提高。数据在内存中的布局方式不应受到关注。“只是我的感觉。”电脑怪胎,这是一个不错的起点。不幸的是,这不是一个完美的匹配,因为它不能处理一组比特。尽管如此,这仍然是一个合理的起点。