__FILF__
宏
__FILE__
宏用于检查当前文件名
#include <cstdio>
using namespace std;
int main() {
printf("%s\n", __FILE__);
return 0;
}
__FUNCTION__
宏、 __func__
宏
__FUNCTION__
宏输出当前函数名
#include <cstdio>
using namespace std;
void foo() {
printf("%s\n", __FUNCTION__); // 输出foo
}
void bar() {
printf("%s\n", __FUNCTION__); // 输出bar
}
int main() {
foo();
bar();
printf("%s\n", __FUNCTION__); // 输出main
return 0;
}
C++11中允许它们用在类或者结构体中:
#include <iostream>
struct TestStruct{
TestStruct() : name(__FUNCTION__ ) {}
const char *name;
};
int main() {
TestStruct ts;
printf("%s\n", ts.name);
return 0;
}
但是不允许作为函数参数的默认值:
#include <string>
#include <iostream>
void FuncFail(const std::string& func_name = __func__){
printf("%s", func_name.c_str()); // 实际上什么也不会打印
};
这是由于在参数声明时,__func__
还没有定义。
__FUNCTION__
和__func__
功能一样
__LINE__
宏
输出当前代码是该文件中的第几行
#include <cstdio>
using namespace std;
void foo() {
printf("%d\n", __LINE__); // 输出5
}
void bar() {
printf("%d\n", __LINE__); // 输出9
}
int main() {
foo();
bar();
printf("%d\n", __LINE__); // 输出15
return 0;
}
总结
联合这三个宏,我们输出调试信息时就可以快速定位错误发生的位置啦。
printf("%s:%d[%s] Error: xxxx\n", __FILE__, __LINE__, __FUNCTION__);