繁体   English   中英

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

[英]Issue with accessing static from outside c++ library

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

项目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库中运行,但是当我尝试通过新代码访问它时,它为null。

D /本机(14119):平局

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

当我从新库中调用它时,为什么它显示为null,但在旧库中却能正常工作? 由于它是静态的,因此不能同时使用吗?

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

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

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

例子.h

extern b2World* world;

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

example.cpp

b2World* world = new b2World(gravity);

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

测试文件

#include <example.h>

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

至少链接器应该没问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM