[英]Issue with accessing static from outside c++ library
我正在做一个项目,在这个项目中,我有以下工作...
JNIBox2DWorld.h
static b2World* world = NULL;
JNIBox2DWorld.cpp
world = new b2World(gravity);
现在这似乎可以正常工作,但是我想添加一个OpenGL渲染器,所以我创建了一个新项目并引用了旧的头文件。
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.