Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用位字段转换大型项目以使用更可移植的内容_C++_C_Bit Fields - Fatal编程技术网

C++ 使用位字段转换大型项目以使用更可移植的内容

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

我正在从事一个大型软件项目,这是一个20多年来拼凑起来的几百万行代码。它是Fortran/C/C++的混合体,目前是针对Solaris的&使用sunstudio构建的,尽管我可以在clang/gcc上编译它

我们正在将项目迁移到Linux/x86环境。我们面临的挑战之一是在整个项目中自由分布数千位字段

目前的想法大致是这样:

1无论是手动触摸还是通过某种重构工具(可能是使用clang制作的),更改所有位字段定义以反转位字段成员的顺序;e、 g:

 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)
你可以看看;它声称提供了更安全的位域实现。不过,我不知道字节顺序。看起来系统正在以一种特殊的、依赖于平台的方式序列化。我认为,通过实际定义和记录序列化格式,并仅在序列化代码中处理字节顺序转换,未来的可维护性将大大提高。数据在内存中的布局方式不应受到关注。“只是我的感觉。”电脑怪胎,这是一个不错的起点。不幸的是,这不是一个完美的匹配,因为它不能处理一组比特。尽管如此,这仍然是一个合理的起点。