C++ C++;诺布需要帮助

C++ C++;诺布需要帮助,c++,namespaces,C++,Namespaces,我在代码风格方面遇到了一些怪癖,我希望能够解决这些怪癖,即名称空间的使用。首先,我要说的是,我目前是我特定项目的唯一软件工程师,没有更多的高级工程师来指导和帮助我。我觉得这特别令人担忧,因为我担心自己正在发展一种非常粗俗的做法,当我试图在不久的将来换工作时,这种做法会让我笑逐颜开 最近我一直在遵循谷歌风格指南。当我得知我一直在做的“使用名称空间std;”的过程遭到反对时,我有点震惊。一般来说,我的大多数项目都相对较小,很少有机会重用我的类。然而,现在我已经做了更多的研究和学习,我意识到为什么我的

我在代码风格方面遇到了一些怪癖,我希望能够解决这些怪癖,即名称空间的使用。首先,我要说的是,我目前是我特定项目的唯一软件工程师,没有更多的高级工程师来指导和帮助我。我觉得这特别令人担忧,因为我担心自己正在发展一种非常粗俗的做法,当我试图在不久的将来换工作时,这种做法会让我笑逐颜开

最近我一直在遵循谷歌风格指南。当我得知我一直在做的“使用名称空间std;”的过程遭到反对时,我有点震惊。一般来说,我的大多数项目都相对较小,很少有机会重用我的类。然而,现在我已经做了更多的研究和学习,我意识到为什么我的实践不受欢迎,我正在寻求改进我使用名称空间和范围操作符的方式。因此,我有以下问题:

  • 什么时候最好定义一个新的名称空间?我知道这是一个奇怪的问题,我知道不属于类的函数或变量可以在名称空间中组合在一起。但是,假设我有一个只由类组成的程序。不定义名称空间是一种不好的做法吗?或者应该为项目单独创建一个新的名称空间,以防以后有人想要与它交互

  • 我知道这是一个令人生厌的争论,但是什么时候使用“std::”好呢?我问这个问题是因为我最近读到关于如何更好地使用C标准库的“包装”版本(例如,cstdlib与stdlib.h)。我把一些源代码改成了实验代码。我立刻发现很奇怪,G++没有因为我没有使用std::printf()而对我大喊大叫,而只是使用printf()。我现在的问题是,在显式范围放置方面,我应该停止在哪里?例如,编译器不会对我大喊大叫关于大小或uint8\t,我是否也必须在它们前面加上“std::?什么是最佳实践

  • 仅对正在使用的函数调用“using”是否考虑“ok”?也就是说,我在讲一个例子,在这个例子中,我有一个类,在实现特定类的.cpp文件中执行类似于“using std::endl;”的操作

  • 编辑以添加第四个问题: 4.在为派生类编写代码时,无论何时调用基类中的函数,即使基类中的函数不是虚拟的且不能重载,都执行“Baseclass::function()”是否有意义?这会妨碍或提高可读性吗

    谢谢你的帮助。我发现这个网站是一个伟大的资源

  • 任何设计为可重用的东西都应该使用名称空间。任何有名称冲突可能性的名称都应该使用名称空间,这几乎意味着任何东西。对于较小的项目,它的重要性较小,但一般来说,所有内容都应该放在某种名称空间中

  • <> L> >基于C++标准,来自C++标准头的任何东西都将在命名空间<代码> STD < /代码>中。它们也可能被拉入全局名称空间。因此,为了实现最大的可移植性,您应该更喜欢使用
    std::printf
    std::uint8\t

  • 这是偏好的问题。对于
    std::
    名称空间中的基本内容,我个人更喜欢显式的,因为要键入的字符太少了。对于高度嵌套的名称空间名称(如
    boost
    的某些部分,其中有3个以上的名称空间可供使用),则使用
    更有意义


  • 例如,我更喜欢使用std::cout,换句话说::FunctionName()。 1.在我看来,这使得代码的审阅者/读者可以清楚/明确地使用此用法。
    2.“使用名称空间”最终包括该名称空间的所有类,因此可能导致与类/函数名冲突。 3.如果您知道自己正在开发的是一个库,那么必须在自己的名称空间中创建它。 4.对于那些不打算开发/与第三方接口的类,我不想麻烦使用名称空间


    如果这回答了你的问题,请告诉我。否则,请回来了解更多细节。

    这些做法多年来一直对我很有帮助。希望这对你有所帮助

    1) 名称空间是一种将相似的东西放在一起的组织技术,通常是为了发现和避免与其他代码发生名称冲突。当您使用支持intellisense的IDE时,它们可以为您提供极大的帮助,使您无需返回文档就可以轻松编写代码。过于细粒度的名称空间可能会像没有名称空间一样对代码有害。虽然这里没有硬性规定,但是如果您一直为少于3-4个项的组创建新名称空间,那么您可能做得太多了。您通常也不会在.cpp文件中定义新的名称空间,因为这是唯一可以看到它的文件。我很少看到其他极端的例子

    使用模板时,所有内容都在标题中,我喜欢在主名称空间下创建一个“详细信息”名称空间,以将模板库的“私有”类与人们实际需要使用的内容隔离开来。还有其他方法可以实现类似的结果,提供更好的封装,但它们也需要更多的维护工作

    2)使用语句通常应该孤立在C++文件中,而不是放置在头文件中,否则你会丢失在大型项目中很快被使用的东西的踪迹。类似地,如果您的头文件不隐式地依赖于using语句,那么对于可移植性和可维护性来说,这是最好的。通过将using语句放在include语句之后,可以很容易地避免这种情况

    // main.cpp
    #include "myheader1.h" // can't see using namespace std, ok.
    
    using namespace std;
    
    // Does this have std:: in front of everything that needs it? 
    // Maybe. Compiler won't tell me...
    #include "myheader2.h" 
    
    决不要将using语句放在打开的namesp中
    namespace A { ... }
    
    namespace B {
      using namespace A; // Don't do it!
    }
    
    using namespace this::thing::is::ridiculous::someone::should::trim::it = ludicrous;
    
    auto p = new ludicrous::SomeClass();