您的位置:首页 > 编程语言 > C语言/C++

C++ namespace笔记

2012-08-31 17:36 162 查看
最近有一个移植项目,需要将Windows平台的一个项目移植到iOS平台,前提是Windows项目由多个动态库组成,是C和C++混合代码,不同的动态库中存在有相同的的文件名,变量名,函数名…。而iOS平台的应用只支持静态库,不支持动态库,也就是说必须把Windows项目所有动态库的代码整合到一个iOS工程中,那么重定义等问题就无法避免了。想了一个解决办法,就是利用namespace,已达到不用修改不同文件中同名变量和函数的目的(当然,文件名相同的就需要改文件名了,namespace解决不了这个问题)。但使用的时候还是发现了一个需要注意的地方,那就是namespace中的变量,具体解释见下面代码中的注释部分,范例如下:

例子中假设一共有5个文件,ClassOne.h, ClassOne.cpp, ClassTwo.h, ClassTwo.cpp,TestNamespace.cpp

代码如下:

ClassOne.h

// ClassOne.h: interface for the CClassOne class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CLASSONE_H__A95C3A2F_01CB_4791_9F19_26ECAEDE69D2__INCLUDED_)
#define AFX_CLASSONE_H__A95C3A2F_01CB_4791_9F19_26ECAEDE69D2__INCLUDED_

namespace NamespaceClassOne{
#define MARCO_DEMO 1
extern int var;         // 用extern指定这不是定义.
// 不能定义具有外部链接的变量。因为有多个编译单元话,在链接的时候会找到多个定义,链接器无法确定应该链接到哪个定义上因此报错。
const int constVal = 1; // 但可以定义常量,因为常量是内部链接。

int Func();
}

#endif // !defined(AFX_CLASSONE_H__A95C3A2F_01CB_4791_9F19_26ECAEDE69D2__INCLUDED_)


ClassOne.cpp

// ClassOne.cpp: implementation of the CClassOne class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ClassOne.h"

namespace NamespaceClassOne{
int var;
int Func()
{
return 1;
}
}


ClassTwo.h

// ClassTwo.h: interface for the CClassTwo class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CLASSTWO_H__7119FA49_C5C4_454B_8C1E_6560783FBF94__INCLUDED_)
#define AFX_CLASSTWO_H__7119FA49_C5C4_454B_8C1E_6560783FBF94__INCLUDED_

namespace NamespaceClassTwo{
#define MARCO_DEMO 1
extern int var;
int Func();
};

#endif // !defined(AFX_CLASSTWO_H__7119FA49_C5C4_454B_8C1E_6560783FBF94__INCLUDED_)


ClassTwo.cpp

// ClassTwo.cpp: implementation of the CClassTwo class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ClassTwo.h"

namespace NamespaceClassTwo{

int var;

int Func()
{
return 2;
}
}


TestNamespace.cpp

// TestNamespace.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "ClassOne.h"
#include "ClassTwo.h"

using namespace NamespaceClassOne;
int main(int argc, char* argv[])
{
int a = Func();
var = a;

int b = NamespaceClassTwo::Func();
NamespaceClassTwo::var = b;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: