在C++中,有时会定义一个变量,但不会使用.这是一个示例 - 与COM_INTERFACE_ENTRY_FUNC_BLINDATL宏一起使用的函数:
HRESULT WINAPI blindQuery( void* /*currentObject*/, REFIID iid, void** ppv, DWORD_PTR /*param*/ )
{
DEBUG_LOG( __FUNCTION__ ); //DEBUG_LOG macro expands to an empty string in non-debug
DEBUG_LOG( iid );
iid; // <<<<<<<----silence compiler warning
if( ppv == 0 ) {
return E_POINTER;
}
*ppv = 0;
return E_NOINTERFACE;
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,iid参数与DEBUG_LOG宏一起使用,在非调试配置中扩展为空字符串.因此,iid不能选择在签名中注释或删除变量名称.当编译非调试配置时,编译器会产生C4100: 'iid' : unreferenced formal parameter警告,因此为了使警告静音iid;,添加了被认为是无操作的语句.
问题如下:如果我们有以下任何声明:
CSomeType variableName; //or
CSomeType& variableName; //or
CSomeType* variableName;
Run Code Online (Sandbox Code Playgroud)
将在C++代码中的以下语句:
variableName; …Run Code Online (Sandbox Code Playgroud) 我想创建在中定义的assert宏的自定义版本,<cassert>在断言失败时显示错误消息。
所需用法:
custom_assert(AClass<T1, T2>::aBoolMethod(), "aBoolMethod must be true");
测试实现有缺陷:
#define custom_assert(mCondition, mMessage) ...
// This fails because mCondition may have commas in it
#define custom_assert(..., mMessage)
// Not sure about this either - mMessage may be an expression containing commas
// as well
Run Code Online (Sandbox Code Playgroud)
如何正确实现一个自定义断言,该自定义断言将布尔表达式(可能带有逗号)作为第一个参数,并将字符串表达式(可能带有逗号)作为第二个参数?
还是有一种不使用宏来实现断言的方法?
我正在使用gtest为我的C ++程序创建单元测试。在我的测试中,我必须写很多这样的检查:
ASSERT_TRUE(myObject.IsValid());
EXPECT_EQ(myObject.GetSomeAttribute(), expectedValue);
Run Code Online (Sandbox Code Playgroud)
我必须写两个检查,因为如果我省略ASSERT_TRUE和myObject碰巧是无效的,则会myObject.GetSomeAttributre()导致调用崩溃。即使在测试中也不是很好。
我想要写的是这样的:
EXPECT_XXX_EQ(myObject.GetSomeAttribute(), expectedValue);
Run Code Online (Sandbox Code Playgroud)
这行代码应该与原始的两行大致相同(带有可选的奖励,如果myObject无效,将被报告,GetSomeAttribute()不会被调用,但是测试将继续运行)。
如何编写这样的自定义断言/期望?