C++ 使用;命名空间foo{";而不是在头文件之外显式限定

C++ 使用;命名空间foo{";而不是在头文件之外显式限定,c++,C++,如果函数被声明为这样的函数: namespace foo { void bar(); } 大多数人对函数的定义如下: void foo::bar() { ... } 但是我喜欢这样做: namespace foo { void bar() { ... } } 我更喜欢这种样式,因为它使我不必总是重新键入foo::,这在接受同一名称空间中声明的类型的函数参数中通常非常繁琐。另外,重命名整个名称空间更容易 我想知道为什么我几乎从未在其他人的代码中

如果函数被声明为这样的函数:

namespace foo {
    void bar();
}
大多数人对函数的定义如下:

void foo::bar() {
    ...
}
但是我喜欢这样做:

namespace foo {
    void bar() {
        ...
    }
}
我更喜欢这种样式,因为它使我不必总是重新键入foo::,这在接受同一名称空间中声明的类型的函数参数中通常非常繁琐。另外,重命名整个名称空间更容易

我想知道为什么我几乎从未在其他人的代码中看到过我的风格,除了额外的缩进级别(甚至不必缩进名称空间)之外,它还有什么缺点吗

可能导致多个定义错误。此错误在链接时出现

假设您已将此
名称空间foo
放在头文件中,并在其中定义了函数
bar()
。现在,当您将此头文件包含到多个
.cpp
文件中时,将生成
foo::bar()
的多个定义。因此,链接器错误


[注意:我假设在第一种情况下,您正在.cpp文件中定义
foo::bar

在命令行上查找
foo::bar
并不容易。让
foo::bar
进行grep是非常好的。

如果您使用
foo::bar
表单,并且意外地使用 如果参数不正确,将出现编译器错误。如果将 定义在源文件的命名空间中,将使用不同的参数 只需定义一个不同的函数,就不会得到 错误,直到您尝试链接使用您的函数的代码(在
对于DLL,可能要到运行时才能使用).

大多数人…
真的吗?
我想知道为什么我几乎从来没有在别人的代码中看到过我的风格,真的吗?呃?你看过的代码有多少人?我很少看到前者…我一直使用与你相同的风格,带有缩进…这对我来说似乎是一个相当主观的问题。你没有看到过我写的所有好代码。:-)嗯,真的吗?还有另一个选项“can”not?@Tomalak,我不明白。
namespace foo{void bar();}
不会导致任何链接器错误。因为我假设
foo::bar()
将在
.cpp
文件中定义。为什么2次否决。答案中有什么错误。您可以假设
命名空间foo{void bar{..}}
也是如此。“问题”你所说的与这两种语法之间的任何差异毫无关系。@Tomalak,OP曾问过
我几乎从未在其他人的代码中看到过我的风格,它有什么缺点吗
。算了吧。
foo::bar
表单只能是一个定义,而不是声明。我想。@Tomalak是的。语法不是对于非定义的声明是合法的。“不能是非定义声明”*然后:)
namespace foo {
    void bar {
        ...
     }
 }