gpt4 book ai didi

c++ - 从外部 C++ 库访问静态的问题

转载 作者:行者123 更新时间:2023-11-28 07:31:41 24 4
gpt4 key购买 nike

我正在做一个项目,在这个项目中我有以下...

项目 1

JNIBox2DWorld.h

static b2World* world = NULL;

JNIBox2DWorld.cpp

world = new b2World(gravity);

现在这似乎工作正常,但我想添加一个 OpenGL 渲染器,所以我创建了一个新项目并引用了旧的头文件....

项目2

b2GLPolygonShape.h

#include <Box2D/JNIBox2DWorld.h>
...
class b2GLPolygonShape
{
public:
void Draw();
void Draw(b2PolygonShape* s);
};

b2GLPolygonShape.cpp

#include "b2GLPolygonShape.h"
void b2GLPolygonShape::Draw(){
LOGD("in Draw");
if(world == NULL){
LOGD("World is not set for some reason");
}
else{
LOGD("World is set");
}
}

我看到世界在 Box2D 库中运行,但是当我尝试通过我的新代码访问它时它是空的....

D/Native (14119): in Draw

D/Native (14119): World is not set for some reason

为什么当我从我的新库中调用它时它显示为空,但从旧库中运行正常?既然它是静态的,它不应该与两者一起工作吗?

最佳答案

我想你可能对 static 的作用有点困惑。当您在编译单元(通常是 cpp 文件)中声明一个全局静态变量时,这意味着该变量是编译单元的本地并且不能在其他地方看到。

由于您在包含在两个单独的 cpp 文件中的头文件中声明了一个全局静态变量,因此这最终会导致两个非常不同的(本地编译单元)全局变量,名为 world。但是,在 b2GLPolygonShape.cpp 中创建的 world 变量与在 JNIBox2DWorld.cpp 中创建的变量无关。

您可能想要做的是在头文件中声明一个外部变量:

example.h

extern b2World* world;

在一个,但只有一个(!),cpp 文件中创建对象:

example.cpp

b2World* world = new b2World(gravity);

在另一个 cpp 文件中,您可以使用该对象:

测试.cpp

#include <example.h>

void foo() {
world->whatever();
}

至少链接器应该没问题。

但是,以这种方式使用全局变量会带来各种麻烦(例如,初始化顺序,只是命名最明显的),因此您通常应该寻找其他方式来实现你想要的。你被警告了。祝你好运:-)

关于c++ - 从外部 C++ 库访问静态的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573229/

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