多个C++源文件中使用的命名空间
Namespaces used in multiple C++ source files
我有一个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::
位。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- 在命名空间名称之前加上 :: 是什么意思?