应用程序有2个静态变量范围

时间:2012-01-20 07:50:15

标签: c++ static scope singleton

由于这篇文章变得比它应该的大得多,我又重新开始了。

我的问题是,对于某些共鸣,我的c ++项目的一部分被自动编译成共享库,因此不再与我的代码库的其余部分共享静态范围。

我已经找到了原因,但仍然不明白为什么会这样。

我正在将第三方共享库集成到我的项目中,这需要我在项目中添加一些类。

如果我只链接到库并包含标题,我的项目输出一个exe文件,一切都很好。

我补充的第二个:

(CAkFilePackageLowLevelIOBlocking是我需要通过cpp代码添加到我的项目中的类之一)

protected:
  CAkFilePackageLowLevelIOBlocking m_LowLevelIO;

到我的SoundManager类,然后构建,我在最后得到这个额外的行告诉我它输出.lib和.exp文件:

1>  Generating Code...
1>     Creating library D:\DustCloud\WorkingCopy\src\VS2010\Debug\GameDbg.lib and object D:\DustCloud\WorkingCopy\src\VS2010\Debug\GameDbg.exp
1>  VS2010.vcxproj -> D:\DustCloud\WorkingCopy\src\VS2010\Debug\GameDbg.exe

所以,发布一个更简单的问题,

什么可能导致我的项目需要构建一个.lib文件,只需添加一个由库提供给我的类的类成员?

这可能是一个pragma def或类似于那些强制.lib输出的类中某些东西?

我正在使用VS2010并构建一个普通的旧win32 c ++应用程序

1 个答案:

答案 0 :(得分:0)

经过多次咆哮错误的树之后,我发现我的问题与共享库或范围无关。这个问题是由我放在CPP文件顶部的地图的静态初始化引起的,以避免外部未解决的

CBaseFactory::map_type* CBaseFactory::map = new map_type()

显然正在创建一个新的地图实例......

如果它是NULL

,CBaseFactory还试图在第一次使用时实例化地图
static map_type * getMap() {
    if(!map) 
    { 
      map = new map_type; 
    } 
    return map; 
}

这里显而易见的问题是,如果工厂cpp文件顶部的初始化代码没有先执行,那么在此之前添加的内容将被清除。

之前没有出现过的原因是命名约定完全符合,这个工厂是在ComponentBase.h中定义的,这是第一个执行静态初始化的代码文件,因此没有任何东西被清除。

一旦我添加了ComponentAudio,ComponentAudioCharacter(两者同时出现在ComponentBase之前),因此在地图被覆盖之前已在地图中注册。

所以共享库输出似乎与此无关。

简单地将初始化行转到

CBaseFactory::map_type* CBaseFactory::map = CBaseFactory::map;

不修改地图并导致模板正确编译。

不确定如何,但希望这有助于某人。