使用指令

  如果我们的目的就是将Parser函数简化到正好是原来那个版本,那又该怎么做呢?对于一个大程序而言,如果需要将它从以前模块化程度较低的版本转为使用名字空间的话,这也是一个很合理的想法。

  一个使用指令能把来自一个名字空间的所有名字都变成可用的,几乎像它们原来就声明在其名字空间之外一样(8.2.8节)。例如,

    namespace Parser {
        double prim(bool);
        double term(bool);
        double expr(bool);

        using namespace Lexer;        // 使来自Lexer的所有名字都可以用
        using namespace Error;        // 使来自Error的所有名字都可以用
    }

这就使我们可以完全按照原来的方式写Parser的函数(6.1.1节):

    double Parser::term(bool get)        // 乘和除
    {
        double left = prim(get);

        for(;;)
            switch(curr_tok) {                 // Lexer的curr_tok
            case MUL:                          // Lexer的MUL
                left *= prim(true);
                break;
            case DIV:                          // Lexer的DIV
                if(double d = prim(true)) {
                    left /= d;
                    break;
                }
                return error("divide by 0");   // Error的error
            default:
                return left;
            }
    }

全局性的使用指令是一种完成转变的工具(8.2.9节),在其他方面最好避免使用。在一个名字空间里的使用指令是一种名字空间的组合工具(8.2.8节)。在一个函数里(也只在这种地方),可以安全地将使用指令作为一种方便的记法方式(8.3.3.1节)。

🔚