C ++日志记录:__ VA_ARGS__导致双重促销[-WDouble-promotion]

时间:2017-01-12 09:43:29

标签: c++ c logging c-preprocessor

我想在我的嵌入式项目中启用-Wdouble-promotion标志,以避免意外使用双打。这非常有用,但我无法修复我的记录器组件,因为它使用__VA_ARGS__

void log( const LogLevel _level, const char* const _file, const int _line, const char* const _format, ... )
{
    va_list args;
    va_start( args, _format );
    Com< ILogger >()->Log( _level, _file, _line, _format, args );
    va_end(args);
}
#define LOG_CRITICAL(...) log(LogLevel_Critical, __FILE__, __LINE__, __VA_ARGS__)

当我使用stdarg.h__VA_ARGS__时,我的花车被提升为双打(这是标准行为)......

base/logger.h, line 35, column 76:  warning: implicit conversion from ‘float’ to ‘double’ when passing argument to function [-Wdouble-promotion]
#define LOG_WARN(...) log(LogLevel_Warning, __FILE__, __LINE__, __VA_ARGS__)
                                                                           ^
base/ntp.cpp, line 91, column 6:  note: in expansion of macro ‘LOG_WARN’
LOG_WARN("System time is stepped by NTP daemon! (%f sec)", offset);
^~~~~~~~

这是一个不幸的情况,但是修改我的记录器组件而不是在后台使用printf是一项非常艰苦的工作,所以我决定在这个标题中禁止这个错误:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdouble-promotion"
//(...) my logger component
#pragma GCC diagnostic pop

但它没有成功,因为当编译器详细说明调用者文件中的#define LOG_CRITICAL(...) log(LogLevel_Critical, __FILE__, __LINE__, __VA_ARGS__)宏时会触发警告。

如何抑制可变参数宏的双重促销警告? GCC的具体解决方案也可以。

更新1:

我检查过alk的解决方案:

#define LOG_CRITICAL(...) \
_Pragma( "GCC diagnostic push" ) \
_Pragma( "GCC diagnostic ignored \"-Wdouble-promotion\"" ) \
log(LogLevel_Critical, __FILE__, __LINE__, __VA_ARGS__) \
_Pragma( "GCC diagnostic pop" )

修改后有很多错误:

core/app_health.cpp, line 118, column 1:  error: ‘#pragma’ is not allowed here
LOG_ERROR("[Main]"); 

我认为函数内部不允许使用这种编译指示...

0 个答案:

没有答案
相关问题