项目中一些问题的记录
ostream 的重载。
宏定义函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19const char* LogLevel::ToString(LogLevel::Level level){
switch(level){
// “\” 是换行继续的意思
// #name 表示使用传入的“参数名称”字符串,注意不是name值本身
XX(DEBUG);
XX(INFO);
XX(WARN);
XX(ERROR);
XX(FATAL);
default :
return "UNKNOWN";
}
return "UNKNOWN";
}流对象是不能复制的。
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 才通过auto self = shared_from_this(); //返回一个当前类的std::shared_ptr
shared_from_this 是个模板类,要让使用shared_from_this()的类继承才可使用
如 log.h之中的 class Logger : public std::enable_shared_from_this
我们可通过这种方法来使用智能指针去控制对象的生存周期函数表与函数容器
<<C++ Primer>>第五版第十四章
函数表(function table)是表示函数映射关系的表,常使用map<>来映射 std::string 和 std::function<>。
函数容器的类型是
我们可以为一个或多个实参定义默认值(默认实参 default argument),不过一旦某个形参被赋予了默认值,它后面所有的形参都必须有默认值。
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;几种特殊标准定义
__FILE__ : 正在编译文件的文件名
__LINE__ : 正在编译文件的行号
__DATE__ : 编译时刻的日期字符串
__TIME__ : 编译时刻的时间字符串
__STDC__ : 判断该文件是不是标准C程序