sylar学习-宏的使用

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 "UNKNOWN";
    }
    return "UNKNOWN";
}

在学习宏的时候一开始并不理解这样的用法,主要是没理解宏其实是文本替换,如果将上面变形为:

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";
}

可见清晰了很多,XX()省去了大段的重复编写,XX(DEBUG)...就是直接进行替换,undef结束宏定义。另外指出:#@是单引号,比如#@S结果是'S',   #是双引号,比如#string,结果是"string",     ##是拼接前后,比如123##456,结果是123456.

上一篇:实验7 结构体和文件


下一篇:PAT (Basic Level) Practice 1047 编程团体赛 (20 分)