我正在尝试编写最多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);
int f(attributes::Baz* b);
int f(loggingapi::attributes::Baz* b);
int f(::loggingapi::attributes::Baz* b);
在上面的列表中,编译器的哪个定义更明确/含糊不清?
注意:您必须假设在以下实现中不能缩短名称空间/参数/类/函数名称。
答案 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
命名空间中,因此,无需明确说明它。 Baz
和Biz
实际上位于不同的名称空间中。此外,它是不会编译,因为编译器将在Baz
命名空间中查找loggingapi
,但它不存在。答案 2 :(得分:1)
你应该选择(b)。它更灵活。如果您决定移动或(喘气)剪切并粘贴f
及其相关类型到新的命名空间或项目,则使用(b)确保声明的结构保持内部一致。
您可以选择添加,删除或重命名外包装命名空间,而不会影响附带的代码。
答案 3 :(得分:1)
在h文件中,最好使用完全限定名称,以防止客户端代码中可能存在歧义。在.cpp文件中,只要没有名称冲突,你可以使用简短表示法,如果你愿意的话。
答案 4 :(得分:0)
如果编译器有一些歧义,肯定会报告错误。
我认为问题应该是关于人类读者,这是非常主观的 命名约定取决于
f()
没有明确的选择。我希望,如果两个实体属于同一个namespace
,那么我将至少省略该名称中的那一部分:
namespace loggingapi {
namespace attributes {
class Baz; // forward declare Baz.
}
class Biz {
int f(attribute::Baz* b);
}; // ^^^^^^^^^^^^^
}