4

我正在尝试编写适合最多 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

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

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

在上面的列表中,哪些定义对编译器来说更清晰/模棱两可?

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

4

5 回答 5

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

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

于 2012-10-05T06:42:33.180 回答
2

我会选择b)变体。我的理由如下:

  • 我们假设开发人员知道他现在在哪个名称空间中。因此,在查看 时class Biz,开发人员应该知道该类在loggingapi名称空间中,因此无需显式声明它。
  • 另一方面,a) 变体不够清楚,因为我们应该指出这一点并且实际上Baz位于Biz不同的名称空间中。此外,它不会 compile,因为编译器会Bazloggingapi命名空间中查找,但它不存在。
于 2012-10-05T06:39:29.253 回答
1

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

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

于 2012-10-05T06:42:05.147 回答
1

在 h 文件中最好使用完全限定名称,以防止客户端代码中可能出现的歧义。在 .cpp 文件中,您可以使用短符号,如果您愿意,只要没有名称冲突。

于 2012-10-05T06:45:07.100 回答
0

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

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

  1. 预先确定的编码风格
  2. 你在哪里声明函数f()

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

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

    class Biz {
        int f(attribute::Baz* b);
    };      // ^^^^^^^^^^^^^
}
于 2012-10-05T06:41:48.973 回答