gpt4 book ai didi

c++ - 不能在 C++ 中使用宏

转载 作者:太空狗 更新时间:2023-10-29 19:48:07 27 4
gpt4 key购买 nike

我正在尝试使用 GNU 在 Linux 上的 Eclipse CDT 中构建以下代码:

log_defs.h

#pragma once

#define dbg_log(fmt, ...) debug_logger::debug(__FILE__, __FUNCTION__, __LINE__, fmt, __VA_ARGS__, 0)

错误信息.cpp

ErrorMessage::ErrorMessage( void ){ dbg_log( L"ErrorMessage::ErrorMessage _in" ); }

ErrorMessage::~ErrorMessage( void ){ dbg_log( L"ErrorMessage::~ErrorMessage _in" ); }

我收到以下错误:

../sources/ErrorMessage.cpp: In constructor ‘ErrorMessage::ErrorMessage()’:
/include/log_defs.h:27:97: error: expected primary-expression before ‘,’ token
#define dbg_log(fmt, ...) debug_logger::debug(__FILE__, __FUNCTION__, __LINE__, fmt, __VA_ARGS__, 0)
^
../sources/ErrorMessage.cpp:150:37: note: in expansion of macro ‘dbg_log’
ErrorMessage::ErrorMessage( void ){ dbg_log( L"ErrorMessage::ErrorMessage _in" ); }
^
../sources/ErrorMessage.cpp: In destructor ‘ErrorMessage::~ErrorMessage()’:
/include/log_defs.h:27:97: error: expected primary-expression before ‘,’ token
#define dbg_log(fmt, ...) debug_logger::debug(__FILE__, __FUNCTION__, __LINE__, fmt, __VA_ARGS__, 0)
^
../sources/ErrorMessage.cpp:152:38: note: in expansion of macro ‘dbg_log’
ErrorMessage::~ErrorMessage( void ){ dbg_log( L"ErrorMessage::~ErrorMessage _in" ); }

最佳答案

原因是当您不向宏传递任何附加参数时,__VA_ARGS__ 将展开为空。因此,在宏扩展之后,您最终会得到如下代码:

debug_logger::debug("SomeFile", "SomeFunction", 42, L"TheFormatString", , 0)

如果您发布的代码忠实地捕捉了您的真实场景,解决方法很简单:将 fmt 纳入可变参数部分:

#define dbg_log(...) debug_logger::debug(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__, 0)

这样一来,您将始终向宏传递至少一个参数(fmt 字符串),并且逗号会很好地发挥作用。

关于c++ - 不能在 C++ 中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32825325/

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