C 原因:#1546-D:(ULP 15.1)检测到连续的位字段分配。建议改用位掩码
我正在使用CCS8,使用结构并初始化变量,如下面的代码所示。CCS在第15行、第16行和第17行给了我如下评论: #1546-D:(ULP 15.1)检测到连续的位字段分配。建议改用位掩码 我真的不明白在这种情况下使用位掩码会有什么好处。我假设这句话是一个更一般的东西,它只在奇怪的边缘情况下起作用(?)这个理论有点支持 所附代码:C 原因:#1546-D:(ULP 15.1)检测到连续的位字段分配。建议改用位掩码,c,C,我正在使用CCS8,使用结构并初始化变量,如下面的代码所示。CCS在第15行、第16行和第17行给了我如下评论: #1546-D:(ULP 15.1)检测到连续的位字段分配。建议改用位掩码 我真的不明白在这种情况下使用位掩码会有什么好处。我假设这句话是一个更一般的东西,它只在奇怪的边缘情况下起作用(?)这个理论有点支持 所附代码: #include <msp430.h> typedef struct { unsigned char var1; unsigned in
#include <msp430.h>
typedef struct
{
unsigned char var1;
unsigned int var2;
unsigned char var3;
unsigned char var4;
} Test;
void main ( void )
{
Test BOB;
BOB.var1 = 1;
BOB.var2 = 1;
BOB.var3 = 3;
BOB.var4 = 1;
}
#包括
类型定义结构
{
无符号字符var1;
无符号int-var2;
无符号字符var3;
无符号字符var4;
}试验;
真空总管(真空)
{
测试鲍勃;
BOB.var1=1;
BOB.var2=1;
BOB.var3=3;
BOB.var4=1;
}
我真的很想理解这句话,这样我就可以相应地改变我的编码习惯,如果这样可以防止将来可能出现的问题的话
预先感谢任何反馈/答案。
< P>强>编辑:< /强>我确信这是一个错误,你应该认为它是错误的。请参阅底部的链接 我在你粘贴的代码中看不到任何位字段 如果代码看起来像这样,那就有意义了:
struct s
{
char a : 4;
char b : 4;
};
int main()
{
struct s S;
S.a = 0;
S.b = 0;
return 0;
}
我在TI的论坛上注意到这些关于同一警告的看似误报的报道:
我知道它们很旧,但除非您使用的是最新版本的CCS,否则这可能是误报?正确,我没有使用位字段。您可能也对了,这句话是由软件中的错误引起的。然而,我想知道为什么这会是一个问题,例如在你的例子。赋值高于指定的位字段会导致“溢出”到另一个有效位字段吗?例如:```字符a:4;字符b:4;s、 a=21;//0001 101 s.b=8;//0000 1000//1001 101 Hi@Bassrelic-您的示例不会导致溢出。兼容编译器应屏蔽其他字段,以便分配给一个字段不会溢出到其他字段。我编写的代码只是为了展示bif字段,以防您不熟悉它们——这本身并没有什么问题。位字段的“问题”是有关位字段的一些细节是由实现定义的。看,我很确定这是TI软件中的一个bug,但检查这些细节总是一个好主意。例如,查看C中未定义行为的非穷尽列表(附录J2):感谢@Morten Jensen的澄清+非常有趣的链接!非常感谢!你是对的——这个附录读起来有点吓人,但由于我甚至不知道这个附录确实存在,所以知道一个检查行为的来源对我来说很好,我自己也不确定。再次感谢,这回答了我的问题!有未解决的问题,所以我认为这是一个错误。