多个C++源文件中使用的命名空间

Namespaces used in multiple C++ source files

本文关键字:命名空间 C++ 源文件 多个      更新时间:2023-10-16

我有一个DLL项目,其中有一个.h文件,该文件定义了一个类和相关变量,所有这些都在一个命名空间中。这是使用VS 2008的Windows XP。尽管很明显,这是一个gstreamer程序:-)

我希望变量receiverList在名称空间IPC_RECEIVER中,但我希望在该名称空间之外的名称空间(例如,相应的IPC_SENDER名称空间)中查看它。

// IPC-Receiver..h
#ifndef IPCRECEIVER_H_
   #define IPCRECEIVER_H_
   namespace IPC_RECEIVER
   {  
   ....  class declaration.
   }
   typedef std::list<IPC_RECEIVER::GstReceiver*>             ReceiverList_t;
   typedef std::list<IPC_RECEIVER::GstReceiver*>::iterator   ReceiverListIter_t;
#endif /* IPCRECEIVER_H_ */

然后是一个cpp文件,其中变量g_receiverList在IPC_RECEIVE命名空间中声明,但不在任何类中声明。

// IPC-ReceeiverAPIs.cpp
#include "IPC-Receiver.h"
namespace IPC_RECEIVER
{
   ReceiverList_t    g_receiverList;    // list to track receivers
   ...
}

最后是第三个文件

// IPC-Receiver.cpp
#include "IPC-Receiver.h"
extern ReceiverList_t  g_receiverList;  
namespace IPC_RECEIVER
{
   GstReceiver::GstReceiver()
   {
      g_receiverList.push_back( this );
   }
}

当我编译这个时,我得到了这个错误:

Error   1   error LNK2001: unresolved external symbol 
   "class std::list<class IPC_RECEIVER::GstReceiver *,
   class std::allocator<class IPC_RECEIVER::GstReceiver *> > g_receiverList" 
   (?g_receiverList@@3V?$list@PAVGstReceiver@IPC_RECEIVER@
   @V?$allocator@PAVGstReceiver@IPC_RECEIVER@@@std@@@std@@A)
   IPC-Receiver.obj 

我尝试过在外部和构造函数中添加命名空间名称的各种组合。

IPC_RECEIVER::g_receiverList.push_back( this );

我得到:

Error   1   error C2039: 'g_receiverList' : is not a member of 
'IPC_RECEIVER'  x:ProjectsIPC-dllIPC-dllIPC-Receiver.cpp    54  IPC-dll

使用

extern ReceiverList_t  IPC_RECEIVER::g_receiverList;  

我有两个错误:

Error   2   error C2039: 'g_receiverList' : is not a member of 'IPC_RECEIVER'   x:ProjectsIPC-dllIPC-dllIPC-Receiver.cpp    22    
Error   2   error C2039: 'g_receiverList' : is not a member of 'IPC_RECEIVER'   x:ProjectsIPC-dllIPC-dllIPC-Receiver.cpp    55

其中22和54是使用CCD_ 5的线路。

使用CCD_ 6代替CCD_。

那么,我该如何做到这一点:在一个文件的命名空间中声明一个变量,并在另一个文件中使用它?

这是链接顺序问题吗?

您需要将extern放在名称空间中

namespace IPC_RECEIVER
{
   extern ReceiverList_t    g_receiverList;
}

然后将其与不在IPC_RECEIVER命名空间中的代码中的限定名称一起使用。

例如

void main() {
   IPC_RECEIVER::g_receiverList.push_back(...);
}

在您的示例中,您位于IPC_RECEIVER命名空间中,因此不需要IPC_RECEIVER::位。