开卷有益,挺好的。
这里简单写一下C语言的一些内置变量:
__FILE__ 这个是文件名称
__LINE__ 这个是文件对应的行数
__func__ 这个是调用函数的名称,这里不能当做函数的默认值
贴一个简单的代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
const char* hello() { return __func__; }
const char* world() { return __func__; }
int main() {
std::cout << hello() << "," << world() << std::endl;
return 0;
}
这里对应的输出是
hello,world
下面写一下变长的C语言内置变量 __VA__ARGS__
变长参数宏与printf一起是一对好搭档,下面看下这个例子。
// filename: test.cc
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
#define LOG(...) {\
fprintf(stdout, "%s: Line %d:\t", __FILE__, __LINE__);\
fprintf(stdout, __VA_ARGS__);\
fprintf(stdout, "\n");\
}
#define LOGE(...) {\
fprintf(stderr, "%s: Line %d:\t", __FILE__, __LINE__);\
fprintf(stderr, __VA_ARGS__);\
fprintf(stderr, "\n");\
}
int main()
{
int x = 3;
LOG("x = %d", x);
x++;
LOGE("x = %d", x);
return 0;
}
编译
g++ -g -std=c++11 test.cc -o test
在上面的代码中,用到了stdout,stderr这两个内置变量,分别表示标准输出与错误输出。还有一个stdin,这个就是标准输入。
简单说下我自己的理解,在这里由上面的这些宏定义,差不多就能实现log日志输出的一些打印。
注意,这里只能用 #define来实现,因为用函数,__FILE__ __LINE__ 这两个内置变量会变化。#define 在编译过程中是替代展开的。由上面的 stderr stdout,这样就能实现标准的输出是什么样子的了。
正常时用 LOG,用到标准输出stdout;错误的日志用 LOGE,用到错误输出stderr
下面在来看执行时的输出
./test 1>log.txt 2>log.txt.e
log.txt 文件中是 test.cc: Line 26: x = 3
log.txt.e文件中是 test.cc: Line 28: x = 4
1 代表标准输出,2代表错误输出
根据上面的define,还可以写出 WARN函数,由此就可以建立日志输出了。
其中参考了一篇博文,讲解标准输出,错误输出的文章。
https://blog.csdn.net/origin_lee/article/details/41576975