我正在尝试使用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设置为大端和小端,但我没有看到解释位字段的区别。我应该如何使用它?
答案 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 C
,fa
以及fd
或fb
可以编译为直接从参数加载值的代码。剩下的函数fc
或fc
将包含交换字节的代码。
如您所见,此选项与位字段无关。它确实会影响位字段,但这只是因为位字段存储整数值,并且此选项会影响整数存储。