编辑可能重复的链接并不能帮助解决问题。
下面是带有注释的最小可编译代码,问题是ERR_INFO
宏引起了扩展宏功能HRESULT
中的LOG_IF_FAILED
˙paramater的麻烦
我确定问题很简单,但是调试宏真是一场噩梦。
#define UNICODE
#include <Windows.h>
#include <comdef.h>
#include <iostream>
#include <cwchar>
void DebugLogTrace(PCTSTR format_string, ...)
{
// implementation not important
}
// Writes a sprintf-formatted string to the logging file.
#define TRACE(...) DebugLogTrace(__VA_ARGS__)
#ifdef UNICODE
// 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__))
// Wide string function name
#define FUNCNAME __FUNCTIONW__
// boilerplate macro
#define ERR_INFO FILENAME, FUNCNAME, __LINE__
// Log HRESULTs if failed.
#define LOG_IF_FAILED(file_name, func_name, line, hr) if (FAILED(hr)) \
{ TRACE(TEXT("%s %s %i %s"), file_name, func_name, line, _com_error(hr).ErrorMessage()); }
#else
// ANSI versions here ...
#endif // UNICODE
int main()
{
HRESULT hr = CoInitializeEx(nullptr,
COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
// Here hr is not inserted into expansion
// ERR_INFO macro is causing problems somehow
LOG_IF_FAILED(ERR_INFO, hr);
// This works however
LOG_IF_FAILED(FILENAME, FUNCNAME, __LINE__, hr);
return 0;
}
答案 0 :(得分:1)
LOG_IF_FAILED(ERR_INFO, hr)
应该引起以下情况:
error: macro "LOG_IF_FAILED" requires 4 arguments, but only 2 given
。
这可以通过更高一级的间接解决。
将LOG_IF_FAILED
重命名为LOG_IF_FAILED_
。
然后添加#define LOG_IF_FAILED(...) LOG_IF_FAILED_(__VA_ARGS__)
。
编辑:
由于某种原因,这不适用于MSVC预处理器。如果您使用的是MSVC,则LOG_IF_FAILED
应该定义为:
#define EMPTY
#define LOG_IF_FAILED(...) LOG_IF_FAILED_ EMPTY (__VA_ARGS__)