В С++ иногда будет определена переменная, но не будет использоваться. Вот пример - функция для использования с COM_INTERFACE_ENTRY_FUNC_BLIND
ATL macro:
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' : unreferenced formal parameter
, поэтому для того, чтобы отключить предупреждение, добавлен оператор iid;
, который, как считается, является no-op.
Вопрос заключается в следующем: если у нас есть одно из следующих объявлений:
CSomeType variableName; //or
CSomeType& variableName; //or
CSomeType* variableName;
будет следующий оператор в коде С++:
variableName;
быть не-оператором во все времена независимо от того, что CSomeType
?