在C ++函数中使用多个作用域块

时间:2014-01-22 08:42:48

标签: c++ function scope block

我开始越来越多地使用连续的作用域编写长C ++算法函数,如下所示:

void my_algorithm(const MyStruct1 &iparam1, MyStruct2 &oparam2)
{
    // First block
    MyStruct3 intermediate_var3;
    {
        double temporary_var;
        // Functional step 1.1
        // Functional step 1.2
        intermediate_var3 = ...
    }
    // Second block
    MyStruct4 intermediate_var4;
    {
        double temporary_var;
        // Functional step 2.1
        // Functional step 2.2
        intermediate_var4 = ...
    }
    // Final block
    {
        int temporary_var;
        oparam2 = ...
    }
}

我开始认为这是澄清功能结构和限制临时变量范围的好方法(例如计数器ijk等。我看到这样的范围块在C函数中有意义,以启用新的声明(参见Why enclose blocks of C code in curly braces?)。

在C ++环境中,这是好事还是坏事?

1 个答案:

答案 0 :(得分:1)

这是一个明确的标志,您应该将这些单独的块提取到单独的函数中。

MyStruct3 DoSth3(params)
{
    double temporary_var;
    // Functional step 1.1
    // Functional step 1.2
    return ...
}

MyStruct4 DoSth4(params)
{
    double temporary_var;
    // Functional step 2.1
    // Functional step 2.2
    intermediate_var4 = ...
}

void my_algorithm(const MyStruct1 &iparam1, MyStruct2 &oparam2)
{
    // First block
    MyStruct3 intermediate_var3 = DoSth3(params);

    // Second block
    MyStruct4 intermediate_var4 = DoSth4(params);

    int temporary_var;
    oparam2 = ...
}

可能会发生,您会担心DoSth3DoSth4是公开的,因为它们应该是my_algorithm 上下文中的私有。在这种情况下,您可以通过以下方式解决它:

class my_algorithm
{
private:
    static MyStruct3 DoSth3(params);
    static MyStruct4 DoSth4(params);

public:
    static void Perform(const MyStruct1 &iparam1, MyStruct2 &oparam2);
};