C++ 名称空间与命名约定

C++ 名称空间与命名约定,c++,namespaces,naming-conventions,C++,Namespaces,Naming Conventions,最近,我自己开始了一个新的小项目,正在阅读一些有关命名约定的文献。独立于首选的编码样式, 或者(在我看来,系统匈牙利风格(即使有人认为它不是一个好的风格)不是应用程序风格)或者其他一些我没有提到的风格。我考虑过如何使用命名约定或使用名称空间。我也读过这个 我的注意力集中在继承上 类似谷歌的例子: 类MyClassInterface{ int some_stuff()=0; }; 类MyClassA:MyClassInterface{ int some_stuff(){return 1;} };

最近,我自己开始了一个新的小项目,正在阅读一些有关命名约定的文献。独立于首选的编码样式, 或者(在我看来,系统匈牙利风格(即使有人认为它不是一个好的风格)不是应用程序风格)或者其他一些我没有提到的风格。我考虑过如何使用命名约定或使用名称空间。我也读过这个

我的注意力集中在继承上

类似谷歌的例子:

类MyClassInterface{
int some_stuff()=0;
};
类MyClassA:MyClassInterface{
int some_stuff(){return 1;}
};
类MyClassB:MyClassInterface{
int some_stuff(){return 2;}
};
现在,我的想法是使用名称空间:

namespace my {

namespace interface {
class Class {
  int some_stuff() = 0;
};
} // namespace interface

namespace a {
class Class : interface::Class {
  int some_stuff() { return 1; }
};
} // namespace a

namespace b {
class Class : interface::Class {
  int some_stuff() { return 2; }
};
} // namespace b

} // namespace my
在本例中可以看出这种命名的优点:

using namepsace my;

void foo(interface::Class lala) {
  // do something;
}

// ...
int main() {
  using namespace a;

  Class bar;
  foo(bar);

  b::Class bar2;
  foo(bar2);
}
现在我可以使用名称空间键入一个
,它将始终使用首选名称空间,但所有其他子类仍然可以通过这些名称空间访问

所以我的问题是,这是一个好主意,还是有一些我看不到的缺点

编辑: 我也可以用

namespace my {

namespace interface {
class Class {
  int some_stuff() = 0;
};
} // namespace interface

class ClassA : interface::Class {
  int some_stuff() { return 1; }
};

class ClassB : interface::Class {
  int some_stuff() { return 2; }
};

} // namespace my
不要嵌套到太多的名称空间

补遗
我不确定StackOverflow是否是提出这个问题的正确地方,但在程序员身上甚至没有标签命名约定(而是命名标准)。关于名称空间和命名约定的讨论也不多。如果是错误的,我可以提出我的问题。

我认为一个好规则是:使用名称空间来标识库(库的内容)。在非常特定的情况下使用嵌套名称空间(嵌套名称空间的内容可以被视为库本身的情况)


标准库就是一个例子:它通过
std
名称空间提供其功能,并且(例如)通过
std::chrono
名称空间提供chrono库(它可以被视为库本身)。另一个例子可能是Boost及其库。

你会发现更多关于如何做这些事情的意见,而不是有可能做这些事情。小心点。一个名称空间绝对是个好主意。添加嵌套名称空间后,您可能需要了解ADL的工作原理。@Simple主要目的是在名称空间中设置接口。我还可以做
ClassA:public interface::class{}
类B:公共接口::类{}。如果这样更好的话。@It'sntpette你不应该把每一件小事都放到它自己的名称空间中。例如,<代码> STD< /Cord>命名空间中嵌套的命名空间非常少,不要使用谷歌风格的指南作为学习良好C++实践的指南。是帮助老C++谷歌代码的帮助的指南。BooST正是我要问的原因。例如,在boost::asio上,有许多嵌套的namspace(boost::asio::ip::udp),它提供了用
tcp
替换udp的优势。另外,boost alway对一些内部内容使用了名称空间
detail.
。我想使用
名称空间接口
而不是detail\uu1,因为第一个使用的是最内部的第二个,将其放在名称空间中就好像放在名称(classInterface)中一样更好。我的第一个建议是,请看我的编辑。我现在看到的唯一问题是ADL Simple在他的评论中提到了什么。