在调用函数的任何位置获取文件名和函数名
Getting file and function names wherever a function is called
我使用宏__FILE__
和__func__
来检索文件和函数位置。我的代码结构如下。。。(注意,我使用的是游戏引擎)
测试.h
class TestClass
{
...
void Log(int status);
...
};
测试.cpp
...
void TestClass::Log(int status)
{
printf("%s %s %i",__FILE__,__func__, status);
}
...
我创建了一个类对象,并用它来记录我想要的任何东西
example.cpp
#include "Test.h"
...
TestClass tt;
...
tt.Log((int)1);
...
问题是输出粘贴了Test.cpp的文件和函数名,并注意example.cpp.的文件名和函数
有没有办法解决这个问题,或者我必须一次又一次地直接使用printf语句?
感谢
您不需要在代码中的任何位置使用printf
,但需要使用额外的参数__FILE__
和__func__
来调用TestClass::Log
。
不过,不要威胁,你可以为此创建一个宏,这样你就不必在每次调用中写下额外的参数:
#define TEST_CLASS_LOG(testClassInstance,status)
testClassInstance.Log((int)status, __FILE__, __func__);
而不是调用
tt.Log((int)1);
你会打电话给
TEST_CLASS_LOG(tt,1);
当然,您需要更改Log
签名以考虑额外的参数:
void Log(int status, const char* fileName, const char* functionName);
此外,我看到Log
没有访问任何类成员,所以你可以让它变得更容易,并使它成为static
:
class TestClass
{
static void Log(int status);
};
void TestClass::Log(int status, const char* file, const char* func)
{
printf("%s %s %i", file, func, status);
}
#define TEST_CLASS_LOG(status)
TestClass::Log((int)status, __FILE__, __func__);
所以,如果你这样做,你只需要打电话:
TEST_CLASS_LOG(1);
不幸的是,由于宏在运行时会扩展,因此在不修改代码的情况下,无法自动执行此操作。编译器现在看到的是:
void TestClass::Log(int status)
{
printf("%s %s %i","Test.cpp","Log", status);
}
这就是为什么需要将文件名和函数名作为参数传递。
创建一个宏扩展,用额外的参数调用Log函数。像这样:
void Log(const char* filename, const char* funcname, int status)
{
printf("%s %s %i",filename,funcname, status);
}
...
#define LOG(status) Log(__FILE__, __func__, status)
...
int foo() {
LOG(3);
}
编辑:更详细的解释
这段代码并没有向您展示如何使用类的方法Log,它只是展示了将宏用于您想要的内容的想法。
此外,我看到的大多数日志记录实现都使用静态方法,因此不需要Logger类本身的实例。这就是为什么我没有提出一个也需要一个类成员的宏。
您可以为函数TestClass::Log()
设置文件名和函数位置参数。通话内容如下:
TestClass tt;
...
tt.Log(__FILE__,__func__,(int)1);
...
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 函数来搜索目录中的文件名
- 如何打印通话函数的行号和文件名而不是log.cpp
- 使用GetTemp文件名函数在C++上生成随机文件名
- 使用文件名作为字符串从任意souce .cpp文件中调用函数
- 如何获取函数调用的文件名和行号
- 将文件或文件名传递给函数
- 适用于短文件名的最佳字符串哈希函数
- 自由类型函数可以接受 Unicode 文件名吗?
- 在调用函数的任何位置获取文件名和函数名
- 这个函数请求用户通过循环输入文件名的错误在哪里?
- 通过类文件名调用函数
- 函数,它接受字符串和数字作为创建文件名的参数
- assert函数如何在失败时返回文件名和代码行
- 使用非英语文件名调用avio_open函数无效