项目中一些问题的记录

  1. ostream 的重载。

  2. 宏定义函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    const char* LogLevel::ToString(LogLevel::Level level){
    switch(level){
    #define XX(name) \
    case LogLevel::name: \
    return #name; \
    break;
    // “\” 是换行继续的意思
    // #name 表示使用传入的“参数名称”字符串,注意不是name值本身
    XX(DEBUG);
    XX(INFO);
    XX(WARN);
    XX(ERROR);
    XX(FATAL);
    # undef XX
    default :
    return "UNKNOWN";
    }
    return "UNKNOWN";
    }
  3. 流对象是不能复制的。

    1
    virtual void format(std::shared_ptr<Logger> logger, std::ostream& os, LogLevel::Level level, LogEvent::ptr event) = 0;

    第一次写的为std::ostream os
    我在log.cc中使用时,a->format(logger, ss, level, event);
    报错为:Calling a protected constructor of class ‘std::basic_ostream
    后续修改为 std::ostream& os 才通过

  4. auto self = shared_from_this(); //返回一个当前类的std::shared_ptr
    shared_from_this 是个模板类,要让使用shared_from_this()的类继承才可使用
    如 log.h之中的 class Logger : public std::enable_shared_from_this
    我们可通过这种方法来使用智能指针去控制对象的生存周期

  5. 函数表与函数容器

    <<C++ Primer>>第五版第十四章

    函数表(function table)是表示函数映射关系的表,常使用map<>来映射 std::string 和 std::function<>。

    函数容器的类型是

  6. 我们可以为一个或多个实参定义默认值(默认实参 default argument),不过一旦某个形参被赋予了默认值,它后面所有的形参都必须有默认值。

  7.  int main(int argc, int** argv){   //  or  int main(int argc, int* argv[]){}
     
     }
    

    argc是命令行的总参数个数。
    argv[]有argc个参数,其中第0个参数是程序全名,命令行后面跟的用户输入的参数。
    char *argv[]是一个字符数组,其大小是argc,主要用于命令参数argv[]参数。
    数组里每一个元素代表一个参数。

    eg: 输入 test, a.c ,b.c, t.c 则 argc=4;
    argv[0]=test;
    argv[1]=a.c;
    argv[2]=b.c;
    argc[3]=t.c;

  8. 几种特殊标准定义

    __FILE__ : 正在编译文件的文件名

    __LINE__ : 正在编译文件的行号

    __DATE__ : 编译时刻的日期字符串

    __TIME__ : 编译时刻的时间字符串

    __STDC__ : 判断该文件是不是标准C程序