在我的相等性单元测试中,为什么一个指针指向内存插槽而不是内存中的项?

In my unit test for equality, why does one pointer point to a memory slot rather than the item in memory?

提问人:kfsopdf 提问时间:11/7/2023 最后编辑:273Kkfsopdf 更新时间:11/8/2023 访问量:103

问:

所以我正在运行一个单元测试:

ASSERT_EQ(mifid_trade_report.contingent_transaction_flag, "CONT");

上面还有很多内容,但我删掉了其余部分,因为它指向许多类和文件。

这是我在运行测试时返回的错误消息:

/home/.../test_protocol.cpp:2075: Failure
Expected equality of these values:
  mifid_trade_report.contingent_transaction_flag
    Which is: 
  "CONT"
    Which is: 0x563717b6bffe

两个问题:

  1. 我理解上面的错误消息是指向的,而指向内存插槽是正确的吗?mifid_trade_report.contingent_transaction_flagCONTCONT0x563717b6bffe

  2. 如果 1.没错,为什么它指向内存插槽而不是对象?

我已经复制了其他单元测试的模式完全相同,但其他单元测试没有相同的问题。

C++ 单元测试 GoogleTest

评论

2赞 Retired Ninja 11/7/2023
是什么类型的?mifid_trade_report.contingent_transaction_flag
3赞 Pepijn Kramer 11/7/2023
您正在将指向字符串文本 (“CONT”) 的指针与结构中的指针进行比较。您不是在比较字符串是否相等。这就是为什么在C++中最好将字符串建模为 std::string 或 std::string_view。这些比较运算符将比较字符串的内容,而不是字符串的地址。
1赞 pptaszni 11/7/2023
你有机会吗?contingent_transaction_flagconst char*
3赞 PaulMcKenzie 11/7/2023
@kfsopdf -- -- 这是错误的,因为有 5 个字符,其中包括终止 null。char contingent_transaction_flag[4];"CONT"
1赞 NathanOliver 11/7/2023
有趣的事实,在C++中,可以是或:godbolt.org/z/3hWoszEjz"true" == "true"truefalse

答:

2赞 Louis Go 11/8/2023 #1

ASSERT_STREQ(ptr1,ptr2) 是你需要的。它有助于比较以 nul 结尾的 C 样式字符串内容。 将检查指针本身,因为 a 只是指向 C 字符串的开头。ASSERT_EQchar*

还有其他方法。通过将以 nul 结尾的字符串设置到一个重载的容器中。例如: 和==std::stringstd::string_view

现场演示

#include <gtest/gtest.h>
#include <string_view>
#include <string>
#include <fmt/format.h>

TEST(Foo,Bar){

    const char* cstring = "foo";
    ASSERT_STREQ(cstring, "foo");
    ASSERT_EQ(std::string(cstring), "foo");
    ASSERT_EQ(std::string_view(cstring), "foo");
}

此外,googletest 官方文档确实会引导您进入 api*_STREQ

报价:

EXPECT_EQ

EXPECT_EQ(val1,val2) ASSERT_EQ(val1,val2)

验证 val1==val2. 指针上的指针是否相等。如果用于两个 C 字符串,它会测试它们是否位于同一内存位置,而不是它们是否具有相同的值。使用 EXPECT_STREQ 按值比较 C 字符串(例如 const char*)。

将指针与 NULL 进行比较时,请使用 EXPECT_EQ(ptr, nullptr) 而不是 EXPECT_EQ(ptr, NULL)。