我正在寻找一种方法来编译打印字符串出我的二进制,如果一个特定的基于宏的条件得到满足。
这里,_dLvl
可以有条件地设置为等于或低于最大允许电平。
enum DEBUG_LEVELS : int
{
DEBUG_NONE,
DEBUG_ERRORS,
DEBUG_WARN,
DEBUG_INFO,
DEBUG_VERBOSE
};
#define MAX_LEVEL DEBUG_WARN
int _dLvl = DEBUG_ERRORS;
template <typename... Args> void E(const char * _f, Args... args){
if (_dLvl >= DEBUG_ERRORS){
printf(_f, args...);
}
}
template <typename... Args> void W(const char * _f, Args... args){
if (_dLvl >= DEBUG_WARN){
printf(_f, args...);
}
}
template <typename... Args> void I(const char * _f, Args... args){
if (_dLvl >= DEBUG_INFO){
printf(_f, args...);
}
}
template <typename... Args> void V(const char * _f, Args... args){
if (_dLvl >= DEBUG_VERBOSE){
printf(_f, args...);
}
}
int main(){
E("This will print\n");
W("This might be printed based on _dLvl, existence of this string is ok.\n");
I("This wont print ever, the existence of this string is memory waste\n");
V("Same as I\n");
}
我有一个logger类的多个示例,其中每个示例都有一个不同的MAX级别,这增加了一个挑战,请参见this question,以获得更清楚的多示例示例。
以下是我的解决方案(但这是一个丑陋且难以管理的解决方案,它要求每个示例都有一个特殊的宏,以便在源代码中以不同的方式使用):
#if (WIFI_LOG_MAX_LEVEL >= 1)
#define w_log_E(f_, ...) logger.E((f_), ##__VA_ARGS__)
#else
#define w_log_E(f_, ...)
#endif
#if (WIFI_LOG_MAX_LEVEL >= 2)
#define w_log_W(f_, ...) logger.W((f_), ##__VA_ARGS__)
#else
#define w_log_W(f_, ...)
#endif
#if (WIFI_LOG_MAX_LEVEL >= 3)
#define w_log_I(f_, ...) logger.I((f_), ##__VA_ARGS__)
#else
#define w_log_I(f_, ...)
#endif
#if (WIFI_LOG_MAX_LEVEL >= 4)
#define w_log_V(f_, ...) logger.V((f_), ##__VA_ARGS__)
#else
#define w_log_V(f_, ...)
#endif
有什么诀窍可以解决吗?
2条答案
按热度按时间eoxn13cs1#
在条件编译块中实现日志函数,例如
constexpr if
将是一种现代方法:Demo:显示字符串
"Fuuuuuun"
找不到,因为info级别低于我们选择编译时使用的WARN级别。编译器检测到“空”函数体并优化掉调用:2lpgd9682#
这里有一个完整的答案,它是基于尼科斯Athanasiou的答案(谢谢尼科斯)。
所添加的是每个
DEBUG_LEVELS
枚举的模板化类,它定义了MAX_LEVEL
,在编译时将在constexpr if
语句中使用它,以编译出未使用的字符串。