gpt4 book ai didi

c++ - 在调用函数的任何地方获取文件名和函数名

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:24 25 4
gpt4 key购买 nike

我正在使用宏 __FILE____func__ 来检索文件和函数位置。我的代码结构如下...(注意我使用的是游戏引擎)

测试.h

class TestClass
{
...
void Log(int status);
...
};

测试.cpp

...
void TestClass::Log(int status)
{
printf("%s %s %i",__FILE__,__func__, status);
}
...

.

然后我创建了一个类对象并使用它来记录我想要记录的任何内容。

例子.cpp

#include "Test.h"
...
TestClass tt;
...
tt.Log((int)1);
...

问题是输出粘贴了Test.cpp的文件名和函数名,注意example.cpp的文件名和函数名。

有没有办法解决这个问题,还是我必须一次又一次地直接使用 printf 语句?

谢谢

最佳答案

您不需要在代码中的任何地方使用 printf,但您需要使用额外参数 __FILE__ 调用 TestClass::Log > 和 __func__

但是不要威胁,您可以为此创建一个宏,这样您就不必在每次调用时都写下额外的参数:

#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);
}

这就是为什么您需要将文件名和函数名作为参数传递。

关于c++ - 在调用函数的任何地方获取文件名和函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com