名称空间
在OpenFOAM中,存在一个函数,其名称为exp
,表示数学中的幂操作。同时,C++本身也可以进行这个计算,并且函数名称也为exp
。这会导致调用的时候,编译器并不知道应该调用OpenFOAM的exp
还是C++本身的exp
。一种方法是将其中一个exp
函数进行改名,比如将OpenFOAM中的exp
改成expFoam
。但还有更简单的方式。
名称空间专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。下面用一个例子来介绍名称空间的具体应用。比如下面的代码:
#include <iostream>
//名称空间first
namespace first
{
int test = 0;
}
//名称空间second
namespace second
{
int test = 1;
}
int main()
{
int result;
result = first::test;// result = 0
result = second::test;// result = 1
return 0;
}
在上面的代码中,namespace first
表示定义一个名字为first
的名称空间,随后{}
内的所有内容都属于first
名称空间之内。比如其中的int test = 0;
,表示仅仅是first
中的test
的值为0
。举一反三,后面的namespace second
表示定义一个名字为second
的名称空间,他的test
的值为1
。
下面进入主程序,如果需要调用first
名称空间中的test
,则需要通过first::test
调用。其中的first
为名称空间的名称,名称空间和变量之间用::
连接表示作用域。因此,当result = first::test;
的时候,其值为0;当result = second::test;
的时候,其值为1。
名称空间有另一种调用方法,就是使用using
语句。比如下面这个例子:
#include <iostream>
//名称空间first
namespace first
{
int test = 0;
}
//名称空间second
namespace second
{
int test = 1;
}
using namespace first;
int main()
{
int result;
result = test;// result = 0
std::cout<< result;
result = second::test;// result = 1
std::cout<< result;
return 0;
}
其中的using namespace first;
表示在下面的程序中,如果没有显示的声明名称空间,则默认调用first
名称空间。例如result = test;
等价于result = first::test;
。如果需要调用second
名称空间的变量,也可以使用result = second::test;
。
在这里,同学们起码应该在看到::
符号的时候,想到::
前可能是名称空间的名字。在后面的章节,同学们也会发现::
符号可能也位于类名称之后。
现在回到最开始的C++代码:
#include <iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
现在用户应该知道其中的using namespace std;
表示的为调用std
名称空间的内容。实际上,cout
以及endl
均为std
名称空间的变量。同理,用户也可以不使用using
编译指令,将代码更改为:
#include <iostream>
int main()
{
std::cout << "hello world" << std::endl;
return 0;
}
名称空间也可以用于函数中,比如下面的例子:
#include <iostream>
//名称空间first
namespace first
{
void test()
{
std::cout<<"test function in first" << std::endl;
}
}
//名称空间second
namespace second
{
void test()
{
std::cout<<"test function in second" << std::endl;
}
}
int main()
{
first::test();
second::test();
return 0;
}
在运行上述的程序的时候,first::test();
执行first
名称空间中的test()
函数,second::test();
执行second
名称空间中的test()
函数。再一次的,所有test()
函数中的cout
和endl
变量需要指定std
名称空间。
OpenFOAM实例
OpenFOAM中由于涉及了大量的函数运算,并且OpenFOAM作为一个非常独立的C++库,所有的OpenFOAM变量/函数都被包含在相应的名称空间中。比如下面这一段代码:
Foam::volScalarField Foam::calcNu()
{
return Foam::max
(
nuMin_,
Foam::min
(
nuMax_,
k_*Foam::pow
(
3.0, n - 1.0
)
)
);
}
其返回Foam
名称空间下的volScalarField
类型,并且calcNu()
函数被定义在Foam
名称空间中。函数内部也调用的为Foam
名称空间下的max
,min
等函数。
在这个链接中,用户也可以看到所有的变量均开始于Foam
名称空间。
最后,用户一定要记住,看到::
符号的时候,想到::
前可能是名称空间的名字。