0

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

项目一

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):在抽奖中

D/Native (14119):由于某种原因未设置世界

为什么当我从我的新库中调用它时它显示为 null 但从旧库中可以正常工作?既然它是静态的,它不应该同时使用吗?

4

1 回答 1

1

我认为您可能对静态的作用有些困惑。当您在编译单元(通常是 cpp 文件)中声明全局静态变量时,这意味着该变量是编译单元的本地变量,无法在其他地方看到。

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

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

例子.h

extern b2World* world;

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

例子.cpp

b2World* world = new b2World(gravity);

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

测试.cpp

#include <example.h>

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

至少链接器应该没问题。

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

于 2013-07-10T14:36:50.733 回答