C ++我应该完全限定我的变量类型吗?

时间:2012-10-05 06:34:04

标签: c++ namespaces c++98

我正在尝试编写最多80列以下的代码行。因此,我想知道完全限定我的变量类型是否真的是强制性的?假设以下实现:

//Baz.h
namespace loggingapi {
namespace attributes {
    class Baz {};
}} // namespaces

// Bar.h
namespace loggingapi {
    namespace attributes {
        class Baz; // forward declare Baz.
    }

    class Biz {
        int f(Baz* b);
    };
} // namespaces

要声明我的函数参数类型,有多种方法?

  • a)int f(Baz* b);
  • b)或int f(attributes::Baz* b);
  • c)或int f(loggingapi::attributes::Baz* b);
  • d)或int f(::loggingapi::attributes::Baz* b);

在上面的列表中,编译器的哪个定义更明确/含糊不清?

注意:您必须假设在以下实现中不能缩短名称空间/参数/类/函数名称。

5 个答案:

答案 0 :(得分:3)

变体 e

namespace loggingapi {
    namespace attributes {
        class Baz; // forward declare Baz.
    }

    class Biz {
        typedef attributes::Baz Baz;
        // C++ 11 alternative
        // using Baz = attributes::Baz;

        int f(Baz* b);
    }
} // namespaces

不要忘记别名可以为你做什么......

答案 1 :(得分:2)

我会使用 b)变体。我的理由如下:

  • 我们假设开发人员知道他现在是的名称空间。因此,在查看class Biz时,开发人员应该知道此类位于loggingapi命名空间中,因此,无需明确说明它。
  • 另一方面, a)变体不够明确,因为我们应该指出BazBiz实际上位于不同的名称空间中。此外,它是不会编译,因为编译器将在Baz命名空间中查找loggingapi,但它不存在。

答案 2 :(得分:1)

你应该选择(b)。它更灵活。如果您决定移动或(喘气)剪切并粘贴f及其相关类型到新的命名空间或项目,则使用(b)确保声明的结构保持内部一致。

您可以选择添加,删除或重命名外包装命名空间,而不会影响附带的代码。

答案 3 :(得分:1)

在h文件中,最好使用完全限定名称,以防止客户端代码中可能存在歧义。在.cpp文件中,只要没有名称冲突,你可以使用简短表示法,如果你愿意的话。

答案 4 :(得分:0)

如果编译器有一些歧义,肯定会报告错误。

我认为问题应该是关于人类读者,这是非常主观的 命名约定取决于

  1. 预先确定的编码风格
  2. 您声明函数f()
  3. 的位置

    没有明确的选择。我希望,如果两个实体属于同一个namespace,那么我将至少省略该名称中的那一部分:

    namespace loggingapi {
        namespace attributes {
            class Baz; // forward declare Baz.
        }
    
        class Biz {
            int f(attribute::Baz* b);
        };      // ^^^^^^^^^^^^^
    }