如何在GLib测试框架中断言两个指针指向同一内存地址?
如何在GLib测试框架中断言两个指针指向同一内存地址?
嗨,这个场景GLib早就考虑到了,最优解是直接使用GLib专门提供的g_assert_ptr_equal()宏——这完全是为验证指针是否指向同一内存地址设计的,既简洁又安全,还能完美避开你遇到的类型转换错误。
你只需要把原来的代码替换成这样:
g_assert_ptr_equal(setting, setting_copied);
这个宏内部会安全处理指针类型的比较逻辑,不需要你手动做任何类型转换,跨平台的适配问题GLib也已经帮你搞定了,编译时不会再出现“指针转整数无强制转换”的警告或错误。
为什么你之前的写法会报错?
你之前尝试的g_assert_cmpuint()是用来比较无符号整数的宏,它会把传入的参数隐式转换成guint64类型。但直接把指针(比如你的MsTweaksSetting *)传进去时,相当于把指针直接赋值给整数变量,这违反了C语言的类型安全规则,所以编译器触发了-Wint-conversion的错误(你的编译环境把这个警告当成了错误来处理)。
退而求其次的整数比较方式(不推荐)
如果你因为某些特殊原因一定要通过整数比较来验证指针地址,那应该用C标准库提供的uintptr_t类型(需要包含<stdint.h>头文件)——这是专门为存储指针值设计的无符号整数类型,能保证在所有平台上都和指针大小匹配。代码示例如下:
#include <stdint.h> // ... g_assert_cmpuint((uintptr_t)setting, ==, (uintptr_t)setting_copied);
不过这种写法既繁琐又没必要,毕竟g_assert_ptr_equal()已经是最贴合需求的工具了。
总结一下,直接用g_assert_ptr_equal()就对了,这是GLib官方推荐的指针地址比较方式,能帮你省掉很多麻烦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

