предупреждение C6031 возвращаемое значение игнорируется при расширении макроса - PullRequest
0 голосов
/ 03 октября 2019

Я использую следующий код для форматирования HRESULT сообщения и записи сообщения в файл, только если HRESULT - ошибка.

Код компилируется и работает нормально, за исключением того, что я получаюследующее предупреждение компилятора :

Предупреждение C6031 Возвращаемое значение игнорируется: 'wcsrchr'.

Я не хочу отключать предупреждение, но разрешить его, но я не могу понять, как? Вот минимальный компилируемый код:

// compile with: /Wall
#include <Windows.h>
#include <cwchar>       // std::wcsrchr
#include <comdef.h>     // _com_error
#include <iostream>     // std::cin

// Show only file name instead of full path wide version
#define __FILENAME__ (std::wcsrchr(TEXT(__FILE__), L'\\') ? std::wcsrchr(TEXT(__FILE__), L'\\') + 1 : TEXT(__FILE__))

// Writes a sprintf-formatted string to the logging file.
#define TRACE(...) DebugLogTrace(__VA_ARGS__)

// Log HRESULTs if failed.
#define LOG_IF_FAILED(file_name, line, hr) if constexpr (FAILED(hr)) \
    { TRACE((TEXT("%s %i %s"), file_name, line, _com_error(hr).ErrorMessage())); }

// Writes a sprintf-formatted string to the logging file.
void DebugLogTrace(PCTSTR format_string, ...) noexcept
{
    // implementation not important
}

int main()
{
      // generate example failure
      LOG_IF_FAILED(__FILENAME__, __LINE__, E_FAIL);

      std::cin.get();
      return 0;
}

Пример файла вывода для E_FAIL код ошибки:

7: 50: 11 Неуказанная ошибка

1 Ответ

1 голос
/ 03 октября 2019

Я смог убрать предупреждение, изменив:

#define LOG_IF_FAILED(file_name, line, hr) if constexpr (FAILED(hr)) \
    { TRACE((TEXT("%s %i %s"), file_name, line, _com_error(hr).ErrorMessage())); }

на

#define LOG_IF_FAILED(file_name, line, hr) if constexpr (FAILED(hr)) \
    { TRACE(TEXT("%s %i %s"), file_name, line, _com_error(hr).ErrorMessage()); }

То есть: { TRACE((..., ..., ..., ...)); } на { TRACE(..., ..., ..., ...); }

Но я должен признать, что я не знаю, есть ли какой-то другой непреднамеренный результат удаления лишних скобок.

...