代码之家  ›  专栏  ›  技术社区  ›  flesh

C++良好的编码风格-总是完全限定库类型?

  •  5
  • flesh  · 技术社区  · 16 年前

    什么是通常认为良好的编码风格在C++中使用标准库中的类型?例如,如果我有一个 using namespace std; 您是否仍希望看到库类型完全符合以下条件: std::string 或者仅仅使用它是可以接受的 string 作为类型标识符?

    11 回复  |  直到 16 年前
        1
  •  14
  •   GManNickG    16 年前

    在头文件中完全限定。在.cpp文件中导入命名空间。

    使全局名称空间不会被简单的#include(包含)弄得乱七八糟

        2
  •  13
  •   Arkaitz Jimenez    16 年前

    using std::string;
    string whatever;
    

    而不是完全引入名称空间。

    在任何情况下,库开发人员都应该避免使用和标准名称冲突的类型名称 string 这可能很常见。

    对于标准以外的库,如果嵌套名称空间不是太长,如果只是typedef,则我希望限定为包含库名称或类似名称的有意义名称。

        3
  •  6
  •   catchmeifyoutry    16 年前

    整个要点应该是避免混淆并生成清晰的代码。 在某些情况下,省略名称空间可能会混淆函数或类的起源,但始终添加完整的名称空间可能会变得难以忍受。

    • 避开 using namespace
    • 使用 在“明显”库的源代码中(例如。 std ,或要在测试程序中测试的库)
    • 您可以在源代码中别名名称空间,以使其简短易读:

    例子

    namespace fs = boost::filesystem;
    bool fileExists = fs::exists(fs::path(filePath));
    

    编辑,以确保完整性: 使用名称空间 在头文件中使用导入的名称空间污染源文件 不明显

        4
  •  5
  •   Jerry Coffin    7 年前

    值得一提的是,通过使用您需要的using指令拉取名称空间,您可以做一些事情 通过限定名称。规范示例可能是编写一个通用排序函数。如果 swap 已为要排序的类型定义,您希望使用它,但如果它没有 它自己,你想用 std::swap .

    using namespace std;
    // ...
    template <class T>
    void my_sort(std::vector<T> &x) {
        // ...
        if (x[j] < x[k])
            swap(x[j], x[k]);
    

    您也可以更具选择性:

    template <class T>
    void my_sort(std::vector<T> &x) {
    
        using std::swap;
    
        if (x[j] < x[k])
            swap(x[j], x[k]);
    

    交换 在排序的任何类型的名称空间中,都将通过依赖于参数的查找找到它。如果没有, 将被找到,因为您已使用using指令/using声明使其可见。在任何情况下,使用完全限定名都将 完成通常认为最令人满意的行为。

        5
  •  1
  •   minjang    16 年前

    namespace 基本上是为了最小化符号名称(如函数、类和变量)之间的冲突。你只要使用 string std::string 除非你自己的图书馆 一串 在它自己的空间里。实际上,我并没有使用非常常见的名称空间,比如 std .

        6
  •  1
  •   Timo Geusch    16 年前

    我确实倾向于遵守两条规则:

    • using namespace std; 因为这可能/将导致有趣的问题,因为您需要在凌晨1点跟踪意外的命名冲突。
    • using std::string; 或类似的。事实上,我并不是100%同意这一点,因为我通常不引入std名称空间,而是引入项目名称空间,但这是我个人的偏好。从来没有 using namespace somethingorother; 不过,最重要的是包括在内。
        7
  •  1
  •   Brian R. Bondy    16 年前

    通常,我将完全限定名称空间,而不是使用 using namespace x

    我两者都做 使用名称空间x 并且完全限定名称空间,这取决于我是否会在源文件中多次重复使用该类型的个人判断调用。

        8
  •  0
  •   Raymond Tay    16 年前

    总的来说,我更喜欢 使用指令 喜欢 using std::string; string hello; 匿名命名空间 使用名称空间指令 像这样将所有名称导入我的匿名命名空间 namespace { using namespace std; // or using std::string string blah_blah_blah; }

        9
  •  0
  •   Liz Albin    16 年前

    我总是在标题中完全限定。我从不在标题中使用“using…”语句。

    我的偏好是在实现文件中也完全限定,但是如果组织标准是在实现文件中包含“使用…”语句,我会这样做,

        10
  •  0
  •   RvdK    16 年前

    我想说,只要使用字符串就可以了。IDE/编译器足够聪明,能够理解您的意思。如果有同名的对象,例如2种字符串类型。然后你会遇到另一个问题,因为编译器不知道你的意思,而程序员也不知道你的意思。

        11
  •  0
  •   Pavel Radzivilovsky    16 年前

    否则就没问题了,尽管存在using语句,但有时我还是符合条件的。在标题中,这是一个问题,除非它在范围内:

    // somefile.h
    namespace VisionMap
    {
         namespace X
         {
             using namespace Y;   // Does not impact the header's user, 
                                  // as would if it was in the global scope.
         }
    }