c/c++ 几个双下划线 实用的内置宏
这几个宏分别是
-
__FILE__ 文件路径文件名 字符串
-
__FUNCTION__ 函数名 字符串
-
__LINE__ 行号 数字
-
__TIME__ 编译时间 字符串
-
__DATE__ 编译日期 字符串
printf("%s %s %d %s %s",__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIME__);
这几个宏在调试时可能会非常有用,并且是c/c++编译器自带的,不会受限于平台的限制。
使用场景案例
以 __FUNCTION__ 举例
公司的c++ profile工具非常好用。如果想要开启的话,有一个关键步骤是在各个函数里的第一行,加上
profileFunction() 这样的一行语句。这样写起来非常简洁,就能够达到统计各个函数耗时的目的。
出于好奇了解了一下 profileFunction() 是如何实现的。
它的基本原理是,在调用这行代码时,在栈内存上定义一个局部变量。
借助 局部变量在定义时会进入constructor,脱出函数作用域调用 destructor 的特性,
实现了一个 Profiler 类,在 构造函数、析构函数里分别 记录 当前时间,从而计算出某个函数 耗费时长的。
基础代码形似这样:
profile.h
class Profile
{
public:
Profile(const std::string& name);
~Profile();
private:
std::string m_name;
};
profile.cpp
#include "profile.h"
Profile::Profile(const std::string& name)
:m_name(name)
{
//printf("%s\n%s\ncompile time:%s %s",__FILE__,__FUNCTION__,__TIME__,__DATE__);
// mark begin time
// @todo
}
Profile::~Profile()
{
// mark end time
// @todo
}
最后,再在 profile.h 定义一个宏:
#define profileFunction() Profile __profiler__(__FUNCTION__);
在 Profile::Profile() 里面记录开始时间,Profile::~Profile() 里记录结束时间,写一些逻辑,即可达到记录函数耗时的效果。
在使用时,比如要 profile main() 函数的耗时,只需要在 main() 函数第一行里增加 profileFunction() 这一句就可以了。
int main()
{
profileFunction();
printf("test\n");
return 0;
}