【发布时间】:2015-11-19 13:43:39
【问题描述】:
我有一个使用宏来跟踪消息的日志库。此宏使用预定义的宏,如 __func__ 和 __PRETTY_FUNCTION__ 来指示消息记录在哪个函数/方法中。
我的日志库的宏在我的日志库的主标题中定义,在任何函数之外。
由于某种原因,预处理代码包含__func__(或__PRETTY_FUNCTION__,如果我正在使用这个),就像这些预定义的宏不存在一样。但我知道它们确实存在,因为如果我在不使用 lib 的跟踪宏的情况下使用它们,它们就可以工作!
这是我的库宏:
#if _MSC_VER >= 1400 // If >= VS2005
#define _TRACE_FUNC_SIGNATURE __FUNCSIG__
#elif defined(__ANDROID__) || defined( __GNUC__ ) && defined( __cplusplus ) // If G++ and/or Android NDK
#define _TRACE_FUNC_SIGNATURE __func__
#else
#error // Unsupported compiler
#endif
// Forces the reprocessing of x to properly expand __VA_ARGS__ when using MSVC compiler
#define _TRACE_REPROCESS( x ) x
#define _TRACE_X( _methodName_, _logCatPtr_, ... ) \
do { \
::dbg::LogCategory * const _catPtrVal_ = (::dbg::LogCategory *)(_logCatPtr_); \
if( NULL != _catPtrVal_ && _catPtrVal_->IsEnabled() ) \
{ \
_TRACE_REPROCESS( _catPtrVal_->_methodName_( _TRACE_FUNC_SIGNATURE " - " __VA_ARGS__ ); ) \
} \
} while( false )
#define TRACE_E( _logCatPtr_, ... ) _TRACE_X( Error, _logCatPtr_, __VA_ARGS__ )
#define TRACE_W( _logCatPtr_, ... ) _TRACE_X( Warning, _logCatPtr_, __VA_ARGS__ )
#define TRACE_I( _logCatPtr_, ... ) _TRACE_X( Info, _logCatPtr_, __VA_ARGS__ )
我知道这些宏没有理由在函数之外定义,但由于我只在函数/方法中使用我的跟踪宏,所以它应该在那里定义!
我正在使用 eclipse 提供的默认 Android NDK 编译器,据我所知,它是某种扩展的 G++。
EDIT :如果我将__func__ 替换为实际的字符串,它可以工作,没有语法错误。这让我觉得__func__ 在我的宏中使用时肯定没有定义。
【问题讨论】:
-
感谢您的评论。不幸的是,我得到了同样的结果。
-
我查看了有
__func__ " - " ...的预处理代码,这给了我一个错误,因为变量不能只跟这样的字符串。如果__func__是一个宏,它会扩展为一个字符串,编译器会将它添加到" - "