gpt4 book ai didi

c++ - 宏功能未按预期扩展

转载 作者:行者123 更新时间:2023-11-28 04:08:49 25 4
gpt4 key购买 nike

编辑可能重复的链接无助于解决问题。

Bellow 是带注释的最小可编译代码,问题是 ERR_INFO 宏导致在宏函数 LOG_IF_FAILED 中扩展 HRESULT˙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;
}

最佳答案

LOG_IF_FAILED(ERR_INFO, hr) 应该会导致以下内容:
错误:宏“LOG_IF_FAILED”需要 4 个参数,但只给出了 2 个

这可以通过多一层间接来解决。

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__)

关于c++ - 宏功能未按预期扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58235714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com