断言:: AreEqual格式消息在一行中

时间:2014-01-10 18:48:51

标签: c++ visual-studio-2012 assert

更新3:

This page告诉我如何分三行完成。任何人都知道如何在一行中完成它?

for (int i = 0; i < 5; i++) {
   my_value_to_verify = get_my_values(i);

   wchar_t message[200];                              // Line 1
   _swprintf(message, L"Value %d failed", i);         // Line 2
   Assert::AreEqual(42, my_value_to_verify, message); // Line 3
}

更新2

正如@JaredPar所指出的那样,我所指的文档实际上是用于C ++ / CLI。在进行额外搜索之后,看起来the following link包含对我正在使用的函数的引用。

更新1

从{i}中删除括号也会导致编译错误:

Error: no instance of overloaded function ...AreEqual matches the argument list (int, int, const wchar_t[16], int)

原帖

使用Microsoft documentation我正在尝试构造一个将打印格式化消息的Assert语句。例如:

for (int i = 0; i < 5; i++) {
   my_value_to_verify = get_my_values(i);
   Assert::AreEqual(42, my_value_to_verify, L"Value %d failed", {i});
}

如果可以的话,忽略其他所有期望我试图在断言语句中打印i的值。最后一个参数“{i}”应该是一个数组 - 我试图遵循文档所述的内容。但是,这样做时会收到编译错误。

(231): error C2143: syntax error : missing ')' before '{'
(231): error C2059: syntax error : ')'
(231): error C2143: syntax error : missing ';' before '{'
(231): error C2143: syntax error : missing ';' before '}'

我正在惹恼如何声明数组以格式化消息。在我的情况下如何声明这个数组?可以在Assert语句中完成吗?

2 个答案:

答案 0 :(得分:5)

如果您不介意使用宏:

#define MSG(msg) [&]{ std::wstringstream _s; _s << msg; return _s.str(); }().c_str()

像这样使用:

Assert::AreEqual(42, my_value_to_verify, MSG("Value " << i << " failed"));

请注意,最后的c_str()必须之外 lambda - str()会返回原始流内容的副本,以便它们能够在破坏后继续存在_s的{​​{1}},但c_str()返回指向内部缓冲区的指针,因此无法从lambda返回。

另请注意,由于正在使用流,因此您可以在所提供的消息中放置您喜欢的任何对象,并且相应的operator<<重载,而不仅仅是int这样的原始类型。

答案 1 :(得分:0)

此处没有理由用i包围{}值。只需直接使用i

即可
Assert::AreEqual(42, my_value_to_verify, L"Value %d failed", i);

...的{​​{1}}部分指定该方法在该位置接受可变数量的参数。因此,您可以通过多种方式调用它

... array<Object^>^