在 C 中使用 pragma pack 的结构相等性
Equality of structure using pragma pack in C
在 C 中无法检查结构是否相等的原因是存在松弛字节,这使得无法进行比较。
但是如果我使用#pragma pack(1) 删除松弛字节,那么比较应该顺利完成,但它仍然会在比较时出错。
示例代码
#include<stdio.h>
#pragma pack(1)
struct person
{
int uid;
char nameStart;
};
struct personDupe
{
int uid;
char nameStart;
};
int main()
{
struct person var;
struct personDupe varDupe;
printf("\nSize of person : %3d\n",sizeof(var));
printf("\nSize of personDupe : %3d\n",sizeof(varDupe));
var.uid = 12;
var.nameStart = 'a';
varDupe.uid = 12;
varDupe.nameStart = 'a';
if(var == varDupe) //Error is introduced
printf("\nStructures are equal\n");
return 0;
}
您的代码无法编译,因为您无法直接比较两个 struct
。
你应该使用 memcmp
:
memcmp(&var, &varDupe, sizeof(var));
这不能解决填充问题,这可以通过确保结构正确初始化为已知值来解决,即使是在填充字节上(可以在字段初始化之前通过 memset
获得) ).
但是打包 struct
以删除填充只是为了检查它们是否相等的方法似乎是一个脆弱的解决方案。如果编译器需要填充,那么它有充分的理由,可能与性能有关。
您还可以告诉编译器您如何检测到两个值相同
bool same_person(struct person* p, struct personDupe* dupe)
{ return p->uid == dupe->uid && p->nameStart == dupe->nameStart; }
然后你可以做
if(same_person(&var, &varDupe))
printf("\nStructures are equal\n");
在 C 中无法检查结构是否相等的原因是存在松弛字节,这使得无法进行比较。
但是如果我使用#pragma pack(1) 删除松弛字节,那么比较应该顺利完成,但它仍然会在比较时出错。
示例代码
#include<stdio.h>
#pragma pack(1)
struct person
{
int uid;
char nameStart;
};
struct personDupe
{
int uid;
char nameStart;
};
int main()
{
struct person var;
struct personDupe varDupe;
printf("\nSize of person : %3d\n",sizeof(var));
printf("\nSize of personDupe : %3d\n",sizeof(varDupe));
var.uid = 12;
var.nameStart = 'a';
varDupe.uid = 12;
varDupe.nameStart = 'a';
if(var == varDupe) //Error is introduced
printf("\nStructures are equal\n");
return 0;
}
您的代码无法编译,因为您无法直接比较两个 struct
。
你应该使用 memcmp
:
memcmp(&var, &varDupe, sizeof(var));
这不能解决填充问题,这可以通过确保结构正确初始化为已知值来解决,即使是在填充字节上(可以在字段初始化之前通过 memset
获得) ).
但是打包 struct
以删除填充只是为了检查它们是否相等的方法似乎是一个脆弱的解决方案。如果编译器需要填充,那么它有充分的理由,可能与性能有关。
您还可以告诉编译器您如何检测到两个值相同
bool same_person(struct person* p, struct personDupe* dupe)
{ return p->uid == dupe->uid && p->nameStart == dupe->nameStart; }
然后你可以做
if(same_person(&var, &varDupe))
printf("\nStructures are equal\n");