cri*_*ian 3 c++ eclipse gnu c-preprocessor
我正在尝试使用GNU在Linux上的Eclipse CDT中构建以下代码:
log_defs.h
#pragma once
#define dbg_log(fmt, ...) debug_logger::debug(__FILE__, __FUNCTION__, __LINE__, fmt, __VA_ARGS__, 0)
Run Code Online (Sandbox Code Playgroud)
ErrorMessage.cpp
ErrorMessage::ErrorMessage( void ){ dbg_log( L"ErrorMessage::ErrorMessage _in" ); }
ErrorMessage::~ErrorMessage( void ){ dbg_log( L"ErrorMessage::~ErrorMessage _in" ); }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
../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" ); }
Run Code Online (Sandbox Code Playgroud)
Rei*_*ica 11
原因是当您没有向宏传递任何其他参数时,__VA_ARGS__扩展为空.因此,在宏扩展之后,您最终会得到以下代码:
debug_logger::debug("SomeFile", "SomeFunction", 42, L"TheFormatString", , 0)
Run Code Online (Sandbox Code Playgroud)
如果您忠实发布的代码捕获了您的真实场景,那么出路很容易:包含fmt在可变参数部分中:
#define dbg_log(...) debug_logger::debug(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__, 0)
Run Code Online (Sandbox Code Playgroud)
这样,你总是将至少一个参数(fmt字符串)传递给宏,逗号将很好地运行.
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |