如何正确使用gcc -fsso-struct用于便携式程序?

时间:2017-01-15 10:51:35

标签: c gcc portability endianness bit-fields

我正在尝试使用gcc选项-fsso-struct来设置可移植的位字段布局(我认为它是gcc-6功能https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html)。

目前,我有两组位域结构:一个用于大端,一个用于小端。我使用BYTE_ORDER标志选择一个或另一个(https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html)。

我将-fsso-struct设置为大端和小端,但我没有看到解释位字段的区别。我应该如何使用它?

1 个答案:

答案 0 :(得分:0)

查看文档中的警告:

  

警告:如果指定的字节顺序不是目标的本机字节顺序, render() { return( <AppThree parentObje={this} /> //pass reference not function ); } //class AppThree <div className='ui bottom attached red basic button' onClick={this.props.parentObj.handleFuncFromAppThree()} // invoke the //function like this > 开关会导致GCC生成与没有它的代码二进制兼容的代码。

任何带有此类警告的选项都是您在与任何库(甚至标准库)交互时不应使用的选项。

此选项也可以本地形式提供,可以通过-fsso-struct指令安全使用。这些功能:

#pragma

使struct A { int i; }; #pragma scalar_storage_order big-endian struct B { int i; }; #pragma scalar_storage_order little-endian struct C { int i; }; #pragma scalar_storage_order default struct D { int i; }; int fa(struct A a) { return a.i; } int fb(struct B b) { return b.i; } int fc(struct C c) { return c.i; } int fd(struct D d) { return d.i; } struct A具有平台的默认字节序,struct D为大端,struct B为小端。因此,struct Cfa以及fdfb可以编译为直接从参数加载值的代码。剩下的函数fcfc将包含交换字节的代码。

如您所见,此选项与位字段无关。它确实会影响位字段,但这只是因为位字段存储整数值,并且此选项会影响整数存储。