在C++中有时会定义一个变量,但是没有使用。这里有一个例子-用于COM_INTERFACE_ENTRY_FUNC_BLIND
ATL宏的函数:
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;
}
在上面的示例中,iid
参数与DEBUG_LOG
宏一起使用,该宏在非调试配置中扩展为空字符串。因此,在签名中注释或删除iid
变量名称不是一个选项。当编译非调试配置时,编译器会生成一个C4100:'iid':未引用的形式参数
警告,因此为了消除警告,被认为是无操作的iid;
语句被添加。问题如下:如果我们有以下任何声明之一:
CSomeType variableName; //or
CSomeType& variableName; //or
CSomeType* variableName;
C++代码中以下语句会如何表现:
variableName;
无论 CSomeType
是什么,始终不执行任何操作?
#define variableName exit(-1)
。 - Benoit