如何比较标准C中两个相等的struct实例?
当前回答
注意,可以在非静态结构上使用memcmp() 担心填充,只要你没有初始化 所有成员(同时)。这是C90定义的:
http://www.pixelbeat.org/programming/gcc/auto_init.html
其他回答
C语言没有提供这样做的语言工具——你必须自己做,并逐个比较每个结构成员。
如果你经常这样做,我建议你写一个函数来比较这两种结构。这样,如果你改变了结构,你只需要改变一个地方的比较。
至于怎么做....您需要单独比较每个元素
您可能会尝试使用memcmp(&a, &b, sizeof(struct foo)),但它可能不是在所有情况下都有效。编译器可以向结构体添加对齐缓冲空间,并且在位于缓冲空间的内存位置上找到的值不保证是任何特定的值。
但是,如果在使用结构之前使用calloc或memset结构的完整大小,则可以与memcmp进行浅比较(如果结构包含指针,则只有在指针指向的地址相同时才匹配)。
@Greg是正确的,在一般情况下必须编写显式比较函数。
在以下情况下可以使用memcmp:
结构体不包含可能是NaN的浮点字段。 结构体不包含填充(使用- wpadding with clang来检查)或者结构体在初始化时显式地使用memset初始化。 没有成员类型(如Windows BOOL)具有不同但等效的值。
除非你正在为嵌入式系统编程(或者编写一个可能用于嵌入式系统的库),否则我不会担心C标准中的一些极端情况。近指针和远指针的区别在任何32位或64位设备上都不存在。我所知道的非嵌入式系统中没有多个NULL指针。
另一种选择是自动生成相等函数。如果以简单的方式布局结构定义,则可以使用简单的文本处理来处理简单的结构定义。对于一般情况,您可以使用libclang—因为它使用与Clang相同的前端,所以它可以正确地处理所有边缘情况(排除错误)。
我还没有见过这样的代码生成库。然而,它看起来相对简单。
然而,这种生成的相等函数在应用程序级别上经常会做错误的事情。例如,Windows中的两个UNICODE_STRING结构应该进行浅比较还是深比较?
这取决于你问的问题是:
这两个结构体是同一个对象吗? 它们的价值相同吗?
要确定它们是否是同一个对象,可以比较指向这两个结构体的指针是否相等。 如果你想从总体上找出它们是否具有相同的值,你必须进行深入的比较。这涉及比较所有成员。如果成员是指向其他结构的指针,你也需要递归到这些结构中。
在结构不包含指针的特殊情况下,您可以执行memcmp来逐个比较每个结构中包含的数据,而不必知道这些数据的含义。
确保你知道' = '对于每个成员意味着什么——这对于整型来说很明显,但对于浮点值或用户定义的类型来说就更微妙了。
推荐文章
- C多行宏:do/while(0) vs作用域块
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- main()中的Return语句vs exit()
- 如果不是内存地址,C指针到底是什么?
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 保护可执行文件不受逆向工程的影响?
- 从C语言的函数返回一个struct
- C99 'restrict'关键字的实际用法?
- 检查子字符串存在于C中的字符串中
- 从标准输入中捕获字符,而不需要等待按enter键
- 查找当前可执行文件的路径,不包含/proc/self/exe