gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:45:23 24 4
gpt4 key购买 nike

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

我想要命名空间 IPC_RECEIVER 中的变量 receiverList,但我想在该命名空间之外查看它,例如,相应的 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:\Projects\IPC-dll\IPC-dll\IPC-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:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp    22    
Error 2 error C2039: 'g_receiverList' : is not a member of 'IPC_RECEIVER' x:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp 55

其中 22 和 54 是使用 g_receiverList 的行。

使用 :: 而不是 IPC_RECEIVER:: 也不起作用。

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

这是链接顺序问题吗?

最佳答案

你需要把extern放在命名空间里

namespace IPC_RECEIVER
{
extern ReceiverList_t g_receiverList;
}

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

例如

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

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

关于c++ - 多个 C++ 源文件中使用的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14988131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com