宏函数未按预期扩展
Macro function not expanding as expected
编辑可能的重复链接无助于解决问题。
Bellow 是一个带有注释的最小可编译代码,问题是ERR_INFO
宏会导致宏函数LOG_IF_FAILED
扩展HRESULT
参数的麻烦
我确定这个问题是微不足道的,但调试宏是一场噩梦。
#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)
应该会导致类似以下内容的内容: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__)
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- 内联扩展编译为函数调用 [C++]
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 可变参数函数参数包扩展
- 从函数为 std::vector 创建自定义扩展
- 宏函数未按预期扩展
- 为什么用C++编写的 phpcpp 扩展函数比用 PHP 编写的函数慢
- 模板包扩展以将函数应用于连续的参数对
- 模板 使用数据数组调用函数时扩展参数包
- 扩展包含静态函数的类
- 是否可以在可变参数模板函数中扩展非可变参数?
- 折叠表达式、参数包扩展、类成员函数中的递归
- 通过 system() 函数调用防止野卡扩展
- 如何扩展函数
- 如何将sqlite3+扩展函数静态链接到C/C++应用程序中
- 使用clCreateEventFromGLsyncKHR扩展函数时发生链接错误
- PHP扩展函数array_init抛出"return_value未声明"
- 模板可以扩展C++函数中的类吗
- 扩展c++函数的奇怪行为