简述
这段代码非常巧妙,乍一看没看懂,再一看也没懂,今天终于看懂了。先简单化一下。
#define XX(name) \
case LogLevel::name: \
return #name; \
break;
XX(DEBUG);
...
#undef XX
再变形
#define XX(name) case LogLevel::name: return #name; break;
XX(DEBUG);
...
#undef XX
是不是就非常清晰了,其中#name经过预处理会转变为"name";
所以这个XX(DEBUG);预处理之后就是
case LogLevel::DEBUG:
return "DEBUG";
break;
全部代码
enum Level {
UNKNOW = 0,
DEBUG = 1,
INFO = 2,
WARN = 3,
ERROR = 4,
FATAL = 5
};
--------------------------------------------
const char* LogLevel::ToString(LogLevel::Level level) {
switch(level) {
#define XX(name) \
case LogLevel::name: \
return #name; \
break;
XX(DEBUG);
XX(INFO);
XX(WARN);
XX(ERROR);
XX(FATAL);
#undef XX
default:
return "UNKNOW";
}
return "UNKNOW";
}
LogLevel::Level LogLevel::FromString(const std::string& str) {
#define XX(level, v) \
if(str == #v) { \
return LogLevel::level; \
}
XX(DEBUG, debug);
XX(INFO, info);
XX(WARN, warn);
XX(ERROR, error);
XX(FATAL, fatal);
XX(DEBUG, DEBUG);
XX(INFO, INFO);
XX(WARN, WARN);
XX(ERROR, ERROR);
XX(FATAL, FATAL);
return LogLevel::UNKNOW;
#undef XX
}