gpt4 book ai didi

c++ - 检测此变量可用性

转载 作者:太空宇宙 更新时间:2023-11-04 14:29:01 24 4
gpt4 key购买 nike

我目前正在调整一个 Windows C++ 项目以使其在 Linux 上运行。我定义了几个宏来将格式化的行打印到日志文件中。它们类似于 printf,所以我可以这样写:

WARN("%d::%s<", 42, "baz");

打印如下内容非常容易:

[thread_id][WARN][/path/to/main.cpp:15][Fri 03/01/2019 10:38:54.408][this_value] 42::baz<

this_valuethis 的值,如果未定义 this 则为 NULL (静态函数,外部“C”函数)。

我当前的代码是:

#if defined(_WIN32) && !defined(__INTELLISENSE__)
#define SET_ZIS __if_exists (this) { zis = this; }
#else
#define SET_ZIS
#endif

#define _LOG(...) \
do \
{ \
void *zis = NULL; \
SET_ZIS \
GetLoggerInstance()->logMessage(__VA_ARGS__); \
} while(0)

#define LOG(...) _LOG(level, __FILE__, __LINE__, __func__, zis, __VA_ARGS__)
#define WARN(...) LOG(ILogger_level::LEVEL_WARN, __VA_ARGS__)

是否有一种标准方法来检测 this 是否存在?也许使用 std::is_* 或 SFINAE 技巧?

我使用外部“C”函数构造对象(“t​​his”是无意义的)并在实例化对象上调用成员(“this”是有意义的)。 “构造函数”在共享对象中导出,并由 C++ 项目动态使用。这样做,我就不必管理错位的名称。

extern "C" int CreateMyClass(std::shared_ptr<MyClass> *newClass);
int CreateMyClass(std::shared_ptr<MyClass> *newClass)
{
RELAY("(%p)", newClass);
*newClass = std::make_shared<MyClass>(42, "baz");
return 0;
}

MyClass::MyClass(int a, char *b)
{
RELAY("(%d,%s)", a, b);
}

编辑:这是一个简单的测试用例:

#include <memory> /* For std::shared_ptr */
#define RELAY(...) printf("[%p][%s]\n", this, __func__)

class MyClass
{
public:
MyClass(int a, const char *b);
static void test();
};

extern "C" int CreateMyClass(std::shared_ptr<MyClass> *newClass);
int CreateMyClass(std::shared_ptr<MyClass> *newClass)
{
RELAY("(%p)", newClass);
*newClass = std::make_shared<MyClass>(42, "baz");
return 0;
}

MyClass::MyClass(int a, const char *b)
{
RELAY("(%d,%s)", a, b);
}

void MyClass::test()
{
RELAY("()");
printf("some work");
}

int main(int argc, char **argv)
{
std::shared_ptr<MyClass> newClass;

int ret = CreateMyClass(&newClass);
MyClass::test();
return ret;
}

g++ 给出以下错误:

test.c: In function ‘int CreateMyClass(std::shared_ptr<MyClass>*)’:
test.c:2:41: error: invalid use of ‘this’ in non-member function
#define RELAY(...) printf("[%p][%s]\n", this, __func__)
^
test.c:14:3: note: in expansion of macro ‘RELAY’
RELAY("(%p)", newClass);
^~~~~
test.c: In static member function ‘static void MyClass::test()’:
test.c:2:41: error: ‘this’ is unavailable for static member functions
#define RELAY(...) printf("[%p][%s]\n", this, __func__)
^
test.c:26:3: note: in expansion of macro ‘RELAY’
RELAY("()");
^~~~~

CreateMyClass 不是静态的(“非成员函数”),因此这是不可用的。静态函数也是如此。

最佳答案

this 引用仅存在并且始终存在于 c++ 类/结构的非静态成员函数中。它是指向函数正在运行的类实例的内存地址的指针。就日志记录而言,除了挖掘内存转储之外,我不确定您将如何使用它,而且我不能 100% 确定实例地址是否对此有用。

关于c++ - 检测此变量可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55051734/

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