繁体   English   中英

不能在C ++中使用宏

[英]Cannot use macro in C++

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

log_defs.h

#pragma once

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

ErrorMessage.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__会扩展为__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字符串)传递给宏,逗号将很好地运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM