名称空间

在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()函数中的coutendl变量需要指定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名称空间下的maxmin等函数。

这个链接中,用户也可以看到所有的变量均开始于Foam名称空间。

最后,用户一定要记住,看到::符号的时候,想到::前可能是名称空间的名字。

results matching ""

    No results matching ""